Getting error predicate error: Insufficient number of signatures from nodes, required: 3, found: 0, even after upgraded to growth plan

When asking for help in this category, please make sure to provide the following details:

  • SDK Version: @web3auth/single-factor-auth": “^9.5.0”,

  • Platform: React native - expo

  • Browser Console Screenshots:

  • If the issue is related to Custom Authentication, please include the following information (optional):

    • Verifier Name: kalki-firebase-test (firebase)
    • JWKS Endpoint:
    • Sample idToken (JWT):

Also, kindly provide the Web3Auth initialization and login code snippet below. This will help us better understand your issue and provide you with the necessary assistance.

const clientId = process.env.EXPO_PUBLIC_WEB3AUTH_CLIENT_ID;
const verifier = process.env.EXPO_PUBLIC_FIREBASE_VERIFIER_IDENTIFIER;

console.log(‘Web3Auth Configuration:’, {
clientId,
verifier,

network: WEB3AUTH_NETWORK.SAPPHIRE_MAINNET,
chainConfig: POLYGON_AMOY_CHAIN_CONFIG
});

// Initialize private key provider
const privateKeyProvider = new EthereumPrivateKeyProvider({
config: {chainConfig: POLYGON_AMOY_CHAIN_CONFIG},
});

// Initialize Web3Auth instance
const web3auth = new Web3Auth({
clientId,
web3AuthNetwork: WEB3AUTH_NETWORK.SAPPHIRE_MAINNET,
privateKeyProvider,
storage: SecureStore,

mode: SDK_MODE.REACT_NATIVE,
});

console.log(‘web3auth:’, web3auth);

interface Web3AuthContextType {
web3AuthLoading: boolean;
web3AuthInitializationError: any;
provider: IProvider | null;
web3authLoggedIn: boolean;
initialized: boolean;
updateWeb3AuthProviderAfterLogin: (loginResult: any) => Promise<string | null>;
}

const Web3AuthContext = createContext<Web3AuthContextType | null>(null);

export const Web3AuthProvider: FC<{ children: React.ReactNode }> = ({ children }) => {
const [web3AuthLoading, setWeb3AuthLoading] = useState(true);
const [web3AuthInitializationError, setWeb3AuthInitializationError] = useState(null);
const [provider, setProvider] = useState<IProvider | null>(null);
const [web3authLoggedIn, setWeb3authLoggedIn] = useState(false);
const [initialized, setInitialized] = useState(false);

useEffect(() => {
let mounted = true;

const init = async () => {
  if (!mounted) return;

  try {
    
    console.log('Initializing Web3Auth...');
    
    await web3auth.init();
    console.log('Web3Auth initialized successfully');
    setWeb3AuthLoading(false);
    setInitialized(true);
 
    console.log('Web3Auth provider:', web3auth.provider);
    
    if (web3auth.provider) {
      setProvider(web3auth.provider);
      console.log('Web3Auth provider:', web3auth.provider);
    }
    if(web3auth.connected){
      setWeb3authLoggedIn(true);
    }
  } catch (error) {
    console.error('Error initializing Web3Auth:', error);
    if (mounted) {
      setWeb3AuthInitializationError(error);
    }
  } finally {
    if (mounted) {
      setWeb3AuthLoading(false);
    }
  }
};

init();

return () => {
  mounted = false;
};

}, []);

const updateWeb3AuthProviderAfterLogin = async (loginResult: any) => {
try {
if (!web3auth) {
console.error(‘Web3Auth instance is not available’);
return “Web3Auth instance is not available”;
}

  if (!loginResult) {
    console.error('Login result is null or undefined');
    return "Invalid login result";
  }

  console.log('Getting ID token...');
  const idToken = await loginResult.getIdToken(true);
  if (!idToken) {
    console.error('Failed to get ID token');
    return "Failed to get ID token";
  }

  console.log('Decoding token...');
  const parsedToken = decodeToken(idToken);
  console.log('Payload:', parsedToken);
 
  const sub = parsedToken.payload.sub;
  
  if (!sub) {
    console.error('Invalid token payload: missing sub');
    return "Invalid token payload";
  }
  console.log('sub:', sub);

  console.log('Connecting to Web3Auth with:', {
    verifier,
    verifierId: sub,
    hasIdToken: !!idToken,
    clientId,
    network: WEB3AUTH_NETWORK.SAPPHIRE_MAINNET
  });

  try {
    const web3authProvider = await web3auth.connect({
      verifier,
      verifierId: sub,
      idToken,
    });

    if (web3authProvider) {
      console.log('Successfully connected to Web3Auth');
    
      setProvider(web3authProvider);
      setWeb3authLoggedIn(true);
      console.log('web3authProvider:', web3authProvider);
      const ethProvider = new ethers.BrowserProvider(web3authProvider);
      const signer = await ethProvider.getSigner();
      const address = await signer.getAddress();
      console.log('address:', address);
    } else {
      console.error('Web3Auth provider is null after connect');
      return "web3auth provider not updated";
    }
  } catch (connectError) {
    console.error('Error during Web3Auth connect:', connectError);
    if (connectError instanceof Error) {
      return `Error during Web3Auth connect: ${connectError.message}`;
    }
    return "Error during Web3Auth connect";
  }
} catch (error) {
  console.error('Error updating Web3Auth provider:', error);
  if (error instanceof Error) {
    return `Error updating Web3Auth provider: ${error.message}`;
  }
  return "Error updating Web3Auth provider";
}

};

const value: Web3AuthContextType = {
web3AuthLoading,
web3AuthInitializationError,
provider,
web3authLoggedIn,
initialized,
updateWeb3AuthProviderAfterLogin,
};

return React.createElement(Web3AuthContext.Provider, { value }, children);
};

Error Message:

(NOBRIDGE) WARN Failed to decrypt padded share cipher [TypeError: Cannot read property ‘digest’ of undefined]
(NOBRIDGE) WARN Failed to decrypt padded share cipher [TypeError: Cannot read property ‘digest’ of undefined]
(NOBRIDGE) WARN Failed to decrypt padded share cipher [TypeError: Cannot read property ‘digest’ of undefined]
(NOBRIDGE) WARN Failed to decrypt padded share cipher [TypeError: Cannot read property ‘digest’ of undefined]
(NOBRIDGE) WARN Failed to decrypt padded share cipher [TypeError: Cannot read property ‘digest’ of undefined]
(NOBRIDGE) WARN Failed to decrypt padded share cipher [TypeError: Cannot read property ‘digest’ of undefined]
(NOBRIDGE) WARN Failed to decrypt padded share cipher [TypeError: Cannot read property ‘digest’ of undefined]
(NOBRIDGE) WARN Failed to decrypt padded share cipher [TypeError: Cannot read property ‘digest’ of undefined]
(NOBRIDGE) WARN Failed to decrypt padded share cipher [TypeError: Cannot read property ‘digest’ of undefined]
(NOBRIDGE) WARN Failed to decrypt padded share cipher [TypeError: Cannot read property ‘digest’ of undefined]
(NOBRIDGE) WARN Failed to decrypt padded share cipher [TypeError: Cannot read property ‘digest’ of undefined]
(NOBRIDGE) WARN Failed to decrypt padded share cipher [TypeError: Cannot read property ‘digest’ of undefined]
(NOBRIDGE) ERROR Error during Web3Auth connect: [Error: Unable to resolve enough promises.
errors: , , , , ,
predicate error: Insufficient number of signatures from nodes, required: 3, found: 0,

Please help to resolve this issue

Thank you for providing thorough details. Here’s a summary for the support team and a few tips for you:


Issue Summary

  • SDK & Version: @web3auth/single-factor-auth v9.5.0
  • Platform: React Native (Expo)
  • Custom Authentication: Yes, via Firebase
    • Verifier Name: kalki-firebase-test
  • Web3Auth Network: SAPPHIRE_MAINNET
  • ChainConfig: POLYGON_AMOY_CHAIN_CONFIG
  • Error: predicate error: Insufficient number of signatures from nodes, required: 3, found: 0 (even after Growth plan upgrade)
  • Initialization & Login: Provided, see code above.
  • Browser Console Logs / Screenshot: Included

Additional Error Messages:

  • Failed to decrypt padded share cipher
  • Cannot read property 'digest' of undefined
  • Insufficient number of signatures from nodes

Requested Details

  • You have provided the main code, client id, verifier, and error logs.
    If you haven’t already, please provide:
    • Sample JWT (idToken) that is used during the authentication call (can be redacted).
    • Your JWKS endpoint (used by Web3Auth to verify the token’s signature) if you use a custom one.

Possible Causes & Next Steps

1. Verifier Configuration

  • Ensure the verifier kalki-firebase-test is correctly configured in your Web3Auth dashboard, and it is tied to your current project/client ID.
  • On the Growth plan, propagation for additional nodes may take a few hours. If you’ve upgraded very recently, try again after 1-2 hours.

2. JWT Validity

  • Make sure the JWT (idToken) is valid and signed by your Firebase project. You can inspect the token here.
  • The “insufficient number of signatures” error often happens when the idToken is invalid, expired, or the JWKS endpoint is misconfigured.

3. Network/Environment

  • You are using SAPPHIRE_MAINNET. Ensure your application is not running in a restricted/test environment and has access to the wider internet.
  • Make sure the clientId matches what is configured for your verifier in the Web3Auth dashboard.

4. SDK/Expo Compatibility

  • Some Expo versions or environments could cause compatibility issues, especially with crypto/browser APIs used in the SFA SDK.
  • If possible, try a bare React Native run to check if Expo is interfering.

5. Additional Debugging


Next Actions for You

  • Please share your JWKS endpoint and a sample JWT (if safe to do so) for deeper inspection.
  • Double-check your verifier and clientId configuration in both your code and on the Web3Auth dashboard (match them exactly).
  • If you upgraded your plan just now, please wait for an hour for node scaling to complete.

Let us know if you are still seeing this error after trying these steps and sharing the details above. We’ll help troubleshoot and resolve this as quickly as possible!

Note: This response was generated by an AI bot and may require further verification. The Web3Auth support team has tracked this issue and will be responding as soon as possible.

Additionally, we would recommend you to join our biweekly Office Hours to get this resolved even faster. Web3Auth Developer Office Hours

Hey @ram
The Cannot read property 'digest' of undefined issue usually gets fixed if you follow our polyfilling guide here.
Please let me know if that works for you.