Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/server/networks.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
},
Expand Down
31 changes: 31 additions & 0 deletions src/server/utils/__tests__/eth-provider.test.js
Original file line number Diff line number Diff line change
@@ -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'
])
})
})
13 changes: 10 additions & 3 deletions src/server/utils/eth.js
Original file line number Diff line number Diff line change
Expand Up @@ -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({
Expand Down