Skip to content

Commit 4b5349c

Browse files
authored
Merge pull request #6124 from BitGo/WIN-5490_soneium
feat(sdk-coin-soneium): add soneium token support
2 parents e952d49 + 5aca714 commit 4b5349c

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
};
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
@@ -2433,6 +2433,11 @@ export enum UnderlyingAsset {
24332433
'tbera:usdc' = 'tbera:usdc',
24342434
'tbera:ibera' = 'tbera:ibera',
24352435

2436+
// Soneium NFTs
2437+
// generic NFTs
2438+
'erc721:soneiumtoken' = 'erc721:soneiumtoken',
2439+
'erc1155:soneiumtoken' = 'erc1155:soneiumtoken',
2440+
24362441
ERC721 = 'erc721',
24372442
ERC1155 = 'erc1155',
24382443
NONSTANDARD = 'nonstandard',

modules/statics/src/coins.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2347,6 +2347,50 @@ export const coins = CoinMap.fromCoins([
23472347
Networks.test.polygon,
23482348
KeyCurve.Secp256k1
23492349
),
2350+
erc721(
2351+
'7c8a60a0-8ced-4429-b868-02106b3a478d',
2352+
'erc721:soneiumtoken',
2353+
'Generic Soneium ERC721',
2354+
'0xerc721:soneiumtoken',
2355+
GENERIC_TOKEN_FEATURES,
2356+
'',
2357+
'',
2358+
Networks.main.soneium,
2359+
KeyCurve.Secp256k1
2360+
),
2361+
erc1155(
2362+
'64b57b9f-3aaf-4518-95fb-4458abc828fd',
2363+
'erc1155:soneiumtoken',
2364+
'Generic Soneium ERC1155',
2365+
'0xerc1155:soneiumtoken',
2366+
GENERIC_TOKEN_FEATURES,
2367+
'',
2368+
'',
2369+
Networks.main.polygon,
2370+
KeyCurve.Secp256k1
2371+
),
2372+
terc721(
2373+
'c3fd9b27-b7df-4287-8991-58c15d004e83',
2374+
'terc721:soneiumtoken',
2375+
'Generic Soneium ERC721',
2376+
'0xterc721:soneiumtoken',
2377+
GENERIC_TOKEN_FEATURES,
2378+
'',
2379+
'',
2380+
Networks.test.soneium,
2381+
KeyCurve.Secp256k1
2382+
),
2383+
terc1155(
2384+
'8c27076a-c84b-4735-a263-8c47f604df69',
2385+
'terc1155:soneiumtoken',
2386+
'Generic Soneium ERC1155',
2387+
'0xterc1155:soneiumtoken',
2388+
GENERIC_TOKEN_FEATURES,
2389+
'',
2390+
'',
2391+
Networks.test.soneium,
2392+
KeyCurve.Secp256k1
2393+
),
23502394
arbethErc20(
23512395
'14a21e93-b123-4437-b99f-0489947d0379',
23522396
'arbeth:link',
@@ -3532,6 +3576,10 @@ export function createTokenMapUsingConfigDetails(tokenConfigMap: Record<string,
35323576
'erc1155:polygontoken',
35333577
'terc721:polygontoken',
35343578
'terc1155:polygontoken',
3579+
'erc721:soneiumtoken',
3580+
'erc1155:soneiumtoken',
3581+
'terc721:soneiumtoken',
3582+
'terc1155:soneiumtoken',
35353583
]);
35363584

35373585
// 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
};
@@ -428,6 +434,21 @@ const getFormattedPolygonTokens = (customCoinMap = coins) =>
428434
return acc;
429435
}, []);
430436

437+
const getFormattedSoneiumTokens = (customCoinMap = coins) =>
438+
customCoinMap.reduce((acc: EthLikeTokenConfig[], coin) => {
439+
if ((coin instanceof Erc721Coin || coin instanceof Erc1155Coin) && coin.family === CoinFamily.SONEIUM) {
440+
acc.push({
441+
type: coin.name,
442+
coin: coin.network.type === NetworkType.MAINNET ? 'soneium' : 'tsoneium',
443+
network: coin.network.type === NetworkType.MAINNET ? 'Mainnet' : 'Testnet',
444+
name: coin.fullName,
445+
tokenContractAddress: coin.contractAddress.toString().toLowerCase(),
446+
decimalPlaces: coin.decimalPlaces,
447+
});
448+
}
449+
return acc;
450+
}, []);
451+
431452
const getFormattedArbethTokens = (customCoinMap = coins) =>
432453
customCoinMap.reduce((acc: EthLikeTokenConfig[], coin) => {
433454
if (coin instanceof ArbethERC20Token) {
@@ -665,6 +686,9 @@ export const getFormattedTokens = (coinMap = coins): Tokens => {
665686
polygon: {
666687
tokens: getFormattedPolygonTokens(coinMap).filter((token) => token.network === 'Mainnet'),
667688
},
689+
soneium: {
690+
tokens: getFormattedSoneiumTokens(coinMap).filter((token) => token.network === 'Mainnet'),
691+
},
668692
arbeth: {
669693
tokens: getFormattedArbethTokens(coinMap).filter((token) => token.network === 'Mainnet'),
670694
},
@@ -732,6 +756,9 @@ export const getFormattedTokens = (coinMap = coins): Tokens => {
732756
polygon: {
733757
tokens: getFormattedPolygonTokens(coinMap).filter((token) => token.network === 'Testnet'),
734758
},
759+
soneium: {
760+
tokens: getFormattedSoneiumTokens(coinMap).filter((token) => token.network === 'Testnet'),
761+
},
735762
arbeth: {
736763
tokens: getFormattedArbethTokens(coinMap).filter((token) => token.network === 'Testnet'),
737764
},

0 commit comments

Comments
 (0)