Skip to content

Commit dc21d53

Browse files
committed
feat(sdk-coin-soneium): add soneium token support
Ticket: WIN-5490
1 parent 2e661d1 commit dc21d53

File tree

9 files changed

+149
-2
lines changed

9 files changed

+149
-2
lines changed

modules/bitgo/src/v2/coinFactory.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ import {
8383
Sip10Token,
8484
Sol,
8585
Soneium,
86+
SoneiumToken,
8687
StellarToken,
8788
Stx,
8889
Stt,
@@ -384,6 +385,10 @@ export function registerCoinConstructors(coinFactory: CoinFactory, coinMap: Coin
384385
coinFactory.register(name, coinConstructor);
385386
});
386387

388+
SoneiumToken.createTokenConstructors().forEach(({ name, coinConstructor }) => {
389+
coinFactory.register(name, coinConstructor);
390+
});
391+
387392
ArbethToken.createTokenConstructors().forEach(({ name, coinConstructor }) => {
388393
coinFactory.register(name, coinConstructor);
389394
});

modules/bitgo/src/v2/coins/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ import { Polyx, Tpolyx } from '@bitgo/sdk-coin-polyx';
4949
import { Rbtc, Trbtc } from '@bitgo/sdk-coin-rbtc';
5050
import { Rune, Trune } from '@bitgo/sdk-coin-rune';
5151
import { Sei, Tsei } from '@bitgo/sdk-coin-sei';
52-
import { Soneium, Tsoneium } from '@bitgo/sdk-coin-soneium';
52+
import { Soneium, Tsoneium, SoneiumToken } from '@bitgo/sdk-coin-soneium';
5353
import { Stt, Tstt } from '@bitgo/sdk-coin-stt';
5454
import { Sgb, Tsgb } from '@bitgo/sdk-coin-sgb';
5555
import { Sol, Tsol } from '@bitgo/sdk-coin-sol';
@@ -118,7 +118,7 @@ export { Rbtc, Trbtc };
118118
export { Rune, Trune };
119119
export { Sgb, Tsgb };
120120
export { Sol, Tsol };
121-
export { Soneium, Tsoneium };
121+
export { Soneium, Tsoneium, SoneiumToken };
122122
export { Stt, Tstt };
123123
export { Stx, Tstx, Sip10Token };
124124
export { Sui, Tsui, SuiToken };

modules/bitgo/test/browser/browser.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ describe('Coins', () => {
3939
Icp: 1,
4040
Ticp: 1,
4141
Sip10Token: 1,
42+
SoneiumToken: 1,
4243
Polyx: 1,
4344
Tpolyx: 1,
4445
};

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export * from './lib';
22
export * from './soneium';
33
export * from './tsoneium';
4+
export * from './soneiumToken';
45
export * from './register';
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import { BitGoBase } from '@bitgo/sdk-core';
22
import { Soneium } from './soneium';
33
import { Tsoneium } from './tsoneium';
4+
import { SoneiumToken } from './soneiumToken';
45

56
export const register = (sdk: BitGoBase): void => {
67
sdk.register('soneium', Soneium.createInstance);
78
sdk.register('tsoneium', Tsoneium.createInstance);
9+
SoneiumToken.createTokenConstructors().forEach(({ name, coinConstructor }) => {
10+
sdk.register(name, coinConstructor);
11+
});
812
};
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
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+
5+
import { TransactionBuilder } from './lib';
6+
7+
export { EthLikeTokenConfig };
8+
9+
export class SoneiumToken extends EthLikeToken {
10+
public readonly tokenConfig: EthLikeTokenConfig;
11+
static coinNames: CoinNames = {
12+
Mainnet: 'soneium',
13+
Testnet: 'tsoneium',
14+
};
15+
16+
constructor(bitgo: BitGoBase, tokenConfig: EthLikeTokenConfig) {
17+
super(bitgo, tokenConfig, SoneiumToken.coinNames);
18+
}
19+
20+
static createTokenConstructor(config: EthLikeTokenConfig): CoinConstructor {
21+
return super.createTokenConstructor(config, SoneiumToken.coinNames);
22+
}
23+
24+
static createTokenConstructors(): NamedCoinConstructor[] {
25+
return super.createTokenConstructors(SoneiumToken.coinNames);
26+
}
27+
28+
protected getTransactionBuilder(): TransactionBuilder {
29+
return new TransactionBuilder(coins.get(this.getBaseChain()));
30+
}
31+
32+
/** @inheritDoc **/
33+
getMPCAlgorithm(): MPCAlgorithm {
34+
return 'ecdsa';
35+
}
36+
37+
/** @inheritDoc */
38+
supportsTss(): boolean {
39+
return true;
40+
}
41+
42+
/**
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
46+
*/
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);
51+
}
52+
53+
getFullName(): string {
54+
return 'Soneium Token';
55+
}
56+
}

modules/statics/src/base.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2425,6 +2425,11 @@ export enum UnderlyingAsset {
24252425
'tbera:usdc' = 'tbera:usdc',
24262426
'tbera:ibera' = 'tbera:ibera',
24272427

2428+
// Soneium NFTs
2429+
// generic NFTs
2430+
'erc721:soneiumtoken' = 'erc721:soneiumtoken',
2431+
'erc1155:soneiumtoken' = 'erc1155:soneiumtoken',
2432+
24282433
ERC721 = 'erc721',
24292434
ERC1155 = 'erc1155',
24302435
NONSTANDARD = 'nonstandard',

modules/statics/src/coins.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2334,6 +2334,50 @@ export const coins = CoinMap.fromCoins([
23342334
Networks.test.polygon,
23352335
KeyCurve.Secp256k1
23362336
),
2337+
erc721(
2338+
'7c8a60a0-8ced-4429-b868-02106b3a478d',
2339+
'erc721:soneiumtoken',
2340+
'Generic Soneium ERC721',
2341+
'0xerc721:soneiumtoken',
2342+
GENERIC_TOKEN_FEATURES,
2343+
'',
2344+
'',
2345+
Networks.main.soneium,
2346+
KeyCurve.Secp256k1
2347+
),
2348+
erc1155(
2349+
'64b57b9f-3aaf-4518-95fb-4458abc828fd',
2350+
'erc1155:soneiumtoken',
2351+
'Generic Soneium ERC1155',
2352+
'0xerc1155:soneiumtoken',
2353+
GENERIC_TOKEN_FEATURES,
2354+
'',
2355+
'',
2356+
Networks.main.polygon,
2357+
KeyCurve.Secp256k1
2358+
),
2359+
terc721(
2360+
'c3fd9b27-b7df-4287-8991-58c15d004e83',
2361+
'terc721:soneiumtoken',
2362+
'Generic Soneium ERC721',
2363+
'0xterc721:soneiumtoken',
2364+
GENERIC_TOKEN_FEATURES,
2365+
'',
2366+
'',
2367+
Networks.test.soneium,
2368+
KeyCurve.Secp256k1
2369+
),
2370+
terc1155(
2371+
'8c27076a-c84b-4735-a263-8c47f604df69',
2372+
'terc1155:soneiumtoken',
2373+
'Generic Soneium ERC1155',
2374+
'0xterc1155:soneiumtoken',
2375+
GENERIC_TOKEN_FEATURES,
2376+
'',
2377+
'',
2378+
Networks.test.soneium,
2379+
KeyCurve.Secp256k1
2380+
),
23372381
arbethErc20(
23382382
'14a21e93-b123-4437-b99f-0489947d0379',
23392383
'arbeth:link',
@@ -3496,6 +3540,10 @@ export function createTokenMapUsingConfigDetails(tokenConfigMap: Record<string,
34963540
'erc1155:polygontoken',
34973541
'terc721:polygontoken',
34983542
'terc1155:polygontoken',
3543+
'erc721:soneiumtoken',
3544+
'erc1155:soneiumtoken',
3545+
'terc721:soneiumtoken',
3546+
'terc1155:soneiumtoken',
34993547
]);
35003548

35013549
// Add all the coins from statics coin map first

modules/statics/src/tokenConfig.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@ export interface Tokens {
126126
polygon: {
127127
tokens: EthLikeTokenConfig[];
128128
};
129+
soneium: {
130+
tokens: EthLikeTokenConfig[];
131+
};
129132
bsc: {
130133
tokens: EthLikeTokenConfig[];
131134
};
@@ -194,6 +197,9 @@ export interface Tokens {
194197
polygon: {
195198
tokens: EthLikeTokenConfig[];
196199
};
200+
soneium: {
201+
tokens: EthLikeTokenConfig[];
202+
};
197203
arbeth: {
198204
tokens: EthLikeTokenConfig[];
199205
};
@@ -426,6 +432,21 @@ const getFormattedPolygonTokens = (customCoinMap = coins) =>
426432
return acc;
427433
}, []);
428434

435+
const getFormattedSoneiumTokens = (customCoinMap = coins) =>
436+
customCoinMap.reduce((acc: EthLikeTokenConfig[], coin) => {
437+
if ((coin instanceof Erc721Coin || coin instanceof Erc1155Coin) && coin.family === CoinFamily.SONEIUM) {
438+
acc.push({
439+
type: coin.name,
440+
coin: coin.network.type === NetworkType.MAINNET ? 'polygon' : 'tpolygon',
441+
network: coin.network.type === NetworkType.MAINNET ? 'Mainnet' : 'Testnet',
442+
name: coin.fullName,
443+
tokenContractAddress: coin.contractAddress.toString().toLowerCase(),
444+
decimalPlaces: coin.decimalPlaces,
445+
});
446+
}
447+
return acc;
448+
}, []);
449+
429450
const getFormattedArbethTokens = (customCoinMap = coins) =>
430451
customCoinMap.reduce((acc: EthLikeTokenConfig[], coin) => {
431452
if (coin instanceof ArbethERC20Token) {
@@ -663,6 +684,9 @@ export const getFormattedTokens = (coinMap = coins): Tokens => {
663684
polygon: {
664685
tokens: getFormattedPolygonTokens(coinMap).filter((token) => token.network === 'Mainnet'),
665686
},
687+
soneium: {
688+
tokens: getFormattedSoneiumTokens(coinMap).filter((token) => token.network === 'Mainnet'),
689+
},
666690
arbeth: {
667691
tokens: getFormattedArbethTokens(coinMap).filter((token) => token.network === 'Mainnet'),
668692
},
@@ -730,6 +754,9 @@ export const getFormattedTokens = (coinMap = coins): Tokens => {
730754
polygon: {
731755
tokens: getFormattedPolygonTokens(coinMap).filter((token) => token.network === 'Testnet'),
732756
},
757+
soneium: {
758+
tokens: getFormattedSoneiumTokens(coinMap).filter((token) => token.network === 'Testnet'),
759+
},
733760
arbeth: {
734761
tokens: getFormattedArbethTokens(coinMap).filter((token) => token.network === 'Testnet'),
735762
},

0 commit comments

Comments
 (0)