diff --git a/src/server/networks.js b/src/server/networks.js index 48122c301..f311169cb 100644 --- a/src/server/networks.js +++ b/src/server/networks.js @@ -61,7 +61,7 @@ export default once(() => { network_id: 50, web3Transport: 'HttpProvider', // eslint-disable-next-line prettier/prettier - httpWeb3Provider: xdcRpc ? xdcRpc : 'https://rpc.xdc.org/', + httpWeb3Provider: xdcRpc ? xdcRpc : 'https://rpc.xdc.org/,https://erpc.xinfin.network', websocketWeb3Provider: '', explorer: xdcExplorers }, diff --git a/src/server/utils/__tests__/eth-provider.test.js b/src/server/utils/__tests__/eth-provider.test.js new file mode 100644 index 000000000..651259980 --- /dev/null +++ b/src/server/utils/__tests__/eth-provider.test.js @@ -0,0 +1,31 @@ +jest.mock('@ambire/signature-validator', () => ({ + verifyMessage: jest.fn().mockResolvedValue(true) +})) + +import { ethers } from 'ethers' +import { verifyMessage } from '@ambire/signature-validator' +import { verifyIdentifier } from '../eth' + +describe('verifyIdentifier RPC fallback', () => { + test('uses multiple default XDC RPC endpoints', async () => { + const configuredRpc = process.env.XDC_RPC + delete process.env.XDC_RPC + + try { + await verifyIdentifier(`0x${'11'.repeat(65)}`, '0x0000000000000000000000000000000000000001', 50) + } finally { + if (configuredRpc === undefined) { + delete process.env.XDC_RPC + } else { + process.env.XDC_RPC = configuredRpc + } + } + + const { provider } = verifyMessage.mock.calls[0][0] + expect(provider).toBeInstanceOf(ethers.providers.FallbackProvider) + expect(provider.providerConfigs.map(({ provider: rpc }) => rpc.connection.url)).toEqual([ + 'https://rpc.xdc.org/', + 'https://erpc.xinfin.network' + ]) + }) +}) diff --git a/src/server/utils/eth.js b/src/server/utils/eth.js index 4e81b6382..499fd7daa 100644 --- a/src/server/utils/eth.js +++ b/src/server/utils/eth.js @@ -59,11 +59,18 @@ export const verifyIdentifier = async (fvsig, gdAddress, chainId = 42220) => { // const celoProvider = new ethers.providers.JsonRpcProvider('https://forno.celo.org') // const xdcProvider = new ethers.providers.JsonRpcProvider('https://rpc.ankr.com/') - const rpc = networks[chainId]?.httpWeb3Provider?.split(',')[0] - const provider = rpc ? new ethers.providers.JsonRpcProvider(rpc) : null - if (!provider) { + const rpcs = networks[chainId]?.httpWeb3Provider?.split(',') || [] + const rpc = rpcs[0] + if (!rpc) { throw new Error(`verifyIdentifier: no RPC for chainId ${chainId} for FV identifier verification`) } + const provider = + rpcs.length > 1 + ? new ethers.providers.FallbackProvider( + rpcs.map(endpoint => new ethers.providers.JsonRpcProvider(endpoint, chainId)), + 1 + ) + : new ethers.providers.JsonRpcProvider(rpc) try { const verifyResult = await verifyMessage({