33 ethers ,
44 Signer ,
55 Contract ,
6- JsonRpcApiProvider ,
76 JsonRpcProvider ,
87 FallbackProvider ,
98 isAddress ,
@@ -15,18 +14,12 @@ import { getConfiguration } from './config.js'
1514import { CORE_LOGGER } from './logging/common.js'
1615import { ConnectionStatus } from '../@types/blockchain.js'
1716import { ValidateChainId } from '../@types/commands.js'
18- // import { KNOWN_CONFIDENTIAL_EVMS } from '../utils/address.js'
19- import { OceanNodeConfig } from '../@types/OceanNode.js'
2017import { KeyManager } from '../components/KeyManager/index.js'
2118
2219export class Blockchain {
23- private config ?: OceanNodeConfig // Optional for new constructor
24- private static signers : Map < string , Signer > = new Map ( )
25- private static providers : Map < string , JsonRpcApiProvider > = new Map ( )
2620 private keyManager : KeyManager
2721 private signer : Signer
2822 private provider : FallbackProvider
29- private providers : JsonRpcProvider [ ] = [ ]
3023 private chainId : number
3124 private knownRPCs : string [ ] = [ ]
3225
@@ -65,24 +58,41 @@ export class Blockchain {
6558
6659 public async getProvider ( force : boolean = false ) : Promise < FallbackProvider > {
6760 if ( ! this . provider ) {
68- for ( const rpc of this . knownRPCs ) {
61+ const configs : {
62+ provider : JsonRpcProvider
63+ priority : number
64+ stallTimeout : number
65+ } [ ] = [ ]
66+
67+ const PRIMARY_RPC_TIMEOUT = 3000
68+ const FALLBACK_RPC_TIMEOUT = 1500
69+ for ( let i = 0 ; i < this . knownRPCs . length ; i ++ ) {
70+ const rpc = this . knownRPCs [ i ]
6971 const rpcProvider = new JsonRpcProvider ( rpc )
70- // filter wrong chains or broken RPCs
7172 if ( ! force ) {
7273 try {
7374 const { chainId } = await rpcProvider . getNetwork ( )
7475 if ( chainId . toString ( ) === this . chainId . toString ( ) ) {
75- this . providers . push ( rpcProvider )
76- break
76+ // primary RPC gets lowest priority = is first to be called
77+ configs . push ( {
78+ provider : rpcProvider ,
79+ priority : i + 1 ,
80+ stallTimeout : i === 0 ? PRIMARY_RPC_TIMEOUT : FALLBACK_RPC_TIMEOUT
81+ } )
7782 }
7883 } catch ( error ) {
7984 CORE_LOGGER . error ( `Error getting network for RPC ${ rpc } : ${ error } ` )
8085 }
8186 } else {
82- this . providers . push ( new JsonRpcProvider ( rpc ) )
87+ configs . push ( {
88+ provider : rpcProvider ,
89+ priority : i + 1 ,
90+ stallTimeout : i === 0 ? PRIMARY_RPC_TIMEOUT : FALLBACK_RPC_TIMEOUT
91+ } )
8392 }
8493 }
85- this . provider = new FallbackProvider ( this . providers )
94+ // quorum=1: accept the first response to avoid calls to all configured rpcs
95+ this . provider = new FallbackProvider ( configs , undefined , { quorum : 1 } )
8696 }
8797 return this . provider
8898 }
0 commit comments