11import { NetworkType } from '@bitgo/statics' ;
22import EthereumCommon from '@ethereumjs/common' ;
3- import { InvalidTransactionError } from '@bitgo/sdk-core' ;
3+ import { InvalidTransactionError , common } from '@bitgo/sdk-core' ;
44import { mainnetCommon , testnetCommon } from './resources' ;
5+ import { recoveryBlockchainExplorerQuery as abstractRecoveryQuery } from '@bitgo/abstract-eth' ;
6+ import request from 'superagent' ;
7+ import { addHexPrefix } from 'ethereumjs-util' ;
8+
9+ const RESPONSE_STATUS_ERROR = '0' ;
10+ const RESPONSE_MESSAGE_NOTOK = 'NOTOK' ;
511
612const commons : Map < NetworkType , EthereumCommon > = new Map < NetworkType , EthereumCommon > ( [
713 [ NetworkType . MAINNET , mainnetCommon ] ,
@@ -19,3 +25,65 @@ export function getCommon(network: NetworkType): EthereumCommon {
1925 }
2026 return common ;
2127}
28+
29+ /**
30+ * Handle standard blockchain explorer query
31+ * @param query Query parameters
32+ * @param bitgoEnv BitGo environment
33+ * @returns Response from soneium.network
34+ */
35+ async function handleStandardExplorerQuery ( query : Record < string , string > , bitgoEnv : string ) : Promise < any > {
36+ const apiToken = common . Environments [ bitgoEnv ] . soneiumExplorerApiToken ;
37+ const explorerUrl = common . Environments [ bitgoEnv ] . soneiumExplorerBaseUrl ;
38+ return await abstractRecoveryQuery ( query , explorerUrl as string , apiToken ) ;
39+ }
40+
41+ /**
42+ * Handle proxy blockchain explorer query
43+ * @param query Query parameters
44+ * @param bitgoEnv BitGo environment
45+ * @returns Response from soneium.network
46+ */
47+ async function handleProxyExplorerQuery ( query : Record < string , string > , bitgoEnv : string ) : Promise < any > {
48+ const body = {
49+ jsonrpc : '2.0' ,
50+ method : query . action ,
51+ params : [
52+ {
53+ to : query . to ,
54+ data : addHexPrefix ( query . data ) ,
55+ } ,
56+ query . tag || 'latest' ,
57+ ] ,
58+ id : 1 ,
59+ } ;
60+
61+ const response = await request . post ( common . Environments [ bitgoEnv ] . soneiumExplorerBaseUrl + '/api/eth-rpc' ) . send ( body ) ;
62+
63+ if ( ! response . ok ) {
64+ throw new Error ( 'Could not reach soneium.network' ) ;
65+ }
66+
67+ if ( response . body . status === RESPONSE_STATUS_ERROR && response . body . message === RESPONSE_MESSAGE_NOTOK ) {
68+ throw new Error ( 'Soneium.network rate limit reached' ) ;
69+ }
70+
71+ return response . body ;
72+ }
73+
74+ /**
75+ * Make a query to soneium.network for information such as balance, token balance, solidity calls
76+ * @param query Query parameters
77+ * @param bitgoEnv BitGo environment
78+ * @returns Response from soneium.network
79+ */
80+ export async function recoveryBlockchainExplorerQuery ( query : Record < string , string > , bitgoEnv : string ) : Promise < any > {
81+ try {
82+ if ( query . module === 'proxy' ) {
83+ return await handleProxyExplorerQuery ( query , bitgoEnv ) ;
84+ }
85+ return await handleStandardExplorerQuery ( query , bitgoEnv ) ;
86+ } catch ( error ) {
87+ throw new Error ( `Could not query soneium explorer, error: ${ error ?. message || 'Unknown error' } ` ) ;
88+ }
89+ }
0 commit comments