Skip to content

Commit c27c51a

Browse files
authored
Merge pull request #6537 from BitGo/WIN_6372
fix(sdk-coin-soneium): update recoveryBlockchainExplorerQuery
2 parents 4e4bb0b + fcb7ab4 commit c27c51a

File tree

5 files changed

+86
-28
lines changed

5 files changed

+86
-28
lines changed

modules/sdk-coin-soneium/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@
4343
"@bitgo/abstract-eth": "^24.8.1",
4444
"@bitgo/sdk-core": "^35.8.0",
4545
"@bitgo/statics": "^55.2.0",
46-
"@ethereumjs/common": "^2.6.5"
46+
"@ethereumjs/common": "^2.6.5",
47+
"ethereumjs-util": "^7.1.5",
48+
"superagent": "^10.2.3"
4749
},
4850
"devDependencies": {
4951
"@bitgo/sdk-api": "^1.65.1",

modules/sdk-coin-soneium/src/lib/utils.ts

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
import { NetworkType } from '@bitgo/statics';
22
import EthereumCommon from '@ethereumjs/common';
3-
import { InvalidTransactionError } from '@bitgo/sdk-core';
3+
import { InvalidTransactionError, common } from '@bitgo/sdk-core';
44
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';
511

612
const 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+
}

modules/sdk-coin-soneium/src/soneium.ts

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,11 @@
77
* @coinWebsite https://docs.soneium.org/soneium-chain/quick-start/info
88
*/
99

10-
import { BaseCoin, BitGoBase, common, MPCAlgorithm, MultisigType, multisigTypes } from '@bitgo/sdk-core';
10+
import { BaseCoin, BitGoBase, MPCAlgorithm, MultisigType, multisigTypes } from '@bitgo/sdk-core';
1111
import { BaseCoin as StaticsBaseCoin, coins, ethGasConfigs } from '@bitgo/statics';
12-
import {
13-
AbstractEthLikeNewCoins,
14-
recoveryBlockchainExplorerQuery,
15-
UnsignedSweepTxMPCv2,
16-
RecoverOptions,
17-
OfflineVaultTxInfo,
18-
} from '@bitgo/abstract-eth';
12+
import { AbstractEthLikeNewCoins, UnsignedSweepTxMPCv2, RecoverOptions, OfflineVaultTxInfo } from '@bitgo/abstract-eth';
1913
import { TransactionBuilder } from './lib';
14+
import * as utils from './lib/utils';
2015

2116
export class Soneium extends AbstractEthLikeNewCoins {
2217
protected constructor(bitgo: BitGoBase, staticsCoin?: Readonly<StaticsBaseCoin>) {
@@ -56,13 +51,8 @@ export class Soneium extends AbstractEthLikeNewCoins {
5651
* @param {string} apiKey optional API key to use instead of the one from the environment
5752
* @returns {Promise<Object>} response from Soneium explorer
5853
*/
59-
async recoveryBlockchainExplorerQuery(
60-
query: Record<string, string>,
61-
apiKey?: string
62-
): Promise<Record<string, unknown>> {
63-
const apiToken = apiKey || common.Environments[this.bitgo.getEnv()].soneiumExplorerApiToken;
64-
const explorerUrl = common.Environments[this.bitgo.getEnv()].soneiumExplorerBaseUrl;
65-
return await recoveryBlockchainExplorerQuery(query, explorerUrl as string, apiToken);
54+
async recoveryBlockchainExplorerQuery(query: Record<string, any>): Promise<any> {
55+
return await utils.recoveryBlockchainExplorerQuery(query, this.bitgo.getEnv());
6656
}
6757

6858
/**

modules/sdk-coin-soneium/src/soneiumToken.ts

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { coins, EthLikeTokenConfig } from '@bitgo/statics';
2-
import { BitGoBase, CoinConstructor, common, MPCAlgorithm, NamedCoinConstructor } from '@bitgo/sdk-core';
3-
import { CoinNames, EthLikeToken, recoveryBlockchainExplorerQuery } from '@bitgo/abstract-eth';
4-
2+
import { BitGoBase, CoinConstructor, MPCAlgorithm, NamedCoinConstructor } from '@bitgo/sdk-core';
3+
import { CoinNames, EthLikeToken } from '@bitgo/abstract-eth';
54
import { TransactionBuilder } from './lib';
5+
import * as utils from './lib/utils';
66

77
export { EthLikeTokenConfig };
88

@@ -40,14 +40,12 @@ export class SoneiumToken extends EthLikeToken {
4040
}
4141

4242
/**
43-
* Make a query to Soneium blockchain explorer for information such as balance, token balance, solidity calls
44-
* @param {Object} query key-value pairs of parameters to append after /api
45-
* @returns {Promise<Object>} response Soneium explorer
43+
* Make a query to soneium.network for information such as balance, token balance, solidity calls
44+
* @param {Object} query key-value pairs of parameters to append after /api
45+
* @returns {Promise<Object>} response from soneium.network
4646
*/
47-
async recoveryBlockchainExplorerQuery(query: Record<string, string>): Promise<Record<string, unknown>> {
48-
const apiToken = common.Environments[this.bitgo.getEnv()].soneiumExplorerApiToken;
49-
const explorerUrl = common.Environments[this.bitgo.getEnv()].soneiumExplorerBaseUrl;
50-
return await recoveryBlockchainExplorerQuery(query, explorerUrl as string, apiToken);
47+
async recoveryBlockchainExplorerQuery(query: Record<string, any>): Promise<any> {
48+
return await utils.recoveryBlockchainExplorerQuery(query, this.bitgo.getEnv());
5149
}
5250

5351
getFullName(): string {

modules/sdk-core/src/bitgo/environments.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ const mainnetBase: EnvironmentTemplate = {
231231
icpNodeUrl: 'https://ic0.app',
232232
worldExplorerBaseUrl: 'https://worldscan.org/',
233233
somniaExplorerBaseUrl: 'https://mainnet.somnia.w3us.site/',
234-
soneiumExplorerBaseUrl: 'https://soneium-minato.blockscout.com',
234+
soneiumExplorerBaseUrl: 'https://soneium.blockscout.com',
235235
monExplorerBaseUrl: 'https://mainnet-beta.monvision.io',
236236
stxNodeUrl: 'https://api.hiro.so',
237237
vetNodeUrl: 'https://rpc-mainnet.vechain.energy',

0 commit comments

Comments
 (0)