1
1
import { NetworkType } from '@bitgo/statics' ;
2
2
import EthereumCommon from '@ethereumjs/common' ;
3
- import { InvalidTransactionError } from '@bitgo/sdk-core' ;
3
+ import { InvalidTransactionError , common } from '@bitgo/sdk-core' ;
4
4
import { 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' ;
5
11
6
12
const commons : Map < NetworkType , EthereumCommon > = new Map < NetworkType , EthereumCommon > ( [
7
13
[ NetworkType . MAINNET , mainnetCommon ] ,
@@ -19,3 +25,65 @@ export function getCommon(network: NetworkType): EthereumCommon {
19
25
}
20
26
return common ;
21
27
}
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