Skip to content

Commit 6c0fb6c

Browse files
Merge pull request #6980 from BitGo/COIN-5624
feat: add jetton token standard
2 parents 2e2dc17 + 699415e commit 6c0fb6c

File tree

5 files changed

+110
-1
lines changed

5 files changed

+110
-1
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ export * from './lib';
22
export * from './register';
33
export * from './ton';
44
export * from './tton';
5+
export * from './jettonToken';
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import { BitGoBase, CoinConstructor, NamedCoinConstructor } from '@bitgo/sdk-core';
2+
import { JettonTokenConfig, coins, tokens } from '@bitgo/statics';
3+
import { Ton } from './ton';
4+
5+
export class JettonToken extends Ton {
6+
public readonly tokenConfig: JettonTokenConfig;
7+
8+
constructor(bitgo: BitGoBase, tokenConfig: JettonTokenConfig) {
9+
const staticsCoin = tokenConfig.network === 'Mainnet' ? coins.get('ton') : coins.get('tton');
10+
super(bitgo, staticsCoin);
11+
this.tokenConfig = tokenConfig;
12+
}
13+
14+
static createTokenConstructor(config: JettonTokenConfig): CoinConstructor {
15+
return (bitgo: BitGoBase) => new JettonToken(bitgo, config);
16+
}
17+
18+
static createTokenConstructors(
19+
tokenConfig: JettonTokenConfig[] = [...tokens.bitcoin.ton.tokens, ...tokens.testnet.ton.tokens]
20+
): NamedCoinConstructor[] {
21+
const tokensCtors: NamedCoinConstructor[] = [];
22+
for (const token of tokenConfig) {
23+
const tokenConstructor = JettonToken.createTokenConstructor(token);
24+
tokensCtors.push({ name: token.type, coinConstructor: tokenConstructor });
25+
}
26+
return tokensCtors;
27+
}
28+
29+
get name(): string {
30+
return this.tokenConfig.name;
31+
}
32+
33+
get coin(): string {
34+
return this.tokenConfig.coin;
35+
}
36+
37+
get network(): string {
38+
return this.tokenConfig.network;
39+
}
40+
41+
get contractAddress(): string {
42+
return this.tokenConfig.contractAddress;
43+
}
44+
45+
get decimalPlaces(): number {
46+
return this.tokenConfig.decimalPlaces;
47+
}
48+
49+
getChain(): string {
50+
return this.tokenConfig.type;
51+
}
52+
53+
getBaseChain(): string {
54+
return this.coin;
55+
}
56+
57+
getFullName(): string {
58+
return 'Ton Token';
59+
}
60+
61+
getBaseFactor(): number {
62+
return Math.pow(10, this.tokenConfig.decimalPlaces);
63+
}
64+
}
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 { Ton } from './ton';
33
import { Tton } from './tton';
4+
import { JettonToken } from './jettonToken';
45

56
export const register = (sdk: BitGoBase): void => {
67
sdk.register('ton', Ton.createInstance);
78
sdk.register('tton', Tton.createInstance);
9+
JettonToken.createTokenConstructors().forEach(({ name, coinConstructor }) => {
10+
sdk.register(name, coinConstructor);
11+
});
812
};

modules/statics/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export {
3232
VetNFTCollection,
3333
CosmosChainToken,
3434
AdaToken,
35+
JettonToken,
3536
} from './account';
3637
export { CoinMap } from './map';
3738
export { networkFeatureMapForTokens } from './networkFeatureMapForTokens';

modules/statics/src/tokenConfig.ts

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import {
3131
ZkethERC20Token,
3232
VetNFTCollection,
3333
AdaToken,
34+
JettonToken,
3435
} from './account';
3536
import { CoinFamily, CoinKind, BaseCoin } from './base';
3637
import { coins } from './coins';
@@ -141,6 +142,10 @@ export type CosmosTokenConfig = BaseNetworkConfig & {
141142
denom: string;
142143
};
143144

145+
export type JettonTokenConfig = BaseNetworkConfig & {
146+
contractAddress: string;
147+
};
148+
144149
export type TokenConfig =
145150
| Erc20TokenConfig
146151
| StellarTokenConfig
@@ -164,7 +169,8 @@ export type TokenConfig =
164169
| VetTokenConfig
165170
| VetNFTCollectionConfig
166171
| TaoTokenConfig
167-
| PolyxTokenConfig;
172+
| PolyxTokenConfig
173+
| JettonTokenConfig;
168174

169175
export interface Tokens {
170176
bitcoin: {
@@ -261,6 +267,9 @@ export interface Tokens {
261267
cosmos: {
262268
tokens: CosmosTokenConfig[];
263269
};
270+
ton: {
271+
tokens: JettonTokenConfig[];
272+
};
264273
};
265274
testnet: {
266275
eth: {
@@ -356,6 +365,9 @@ export interface Tokens {
356365
cosmos: {
357366
tokens: CosmosTokenConfig[];
358367
};
368+
ton: {
369+
tokens: JettonTokenConfig[];
370+
};
359371
};
360372
}
361373

@@ -1053,6 +1065,25 @@ function getCosmosTokenConfig(coin: CosmosChainToken): CosmosTokenConfig {
10531065
};
10541066
}
10551067

1068+
function getJettonTokenConfig(coin: JettonToken): JettonTokenConfig {
1069+
return {
1070+
type: coin.name,
1071+
coin: coin.network.type === NetworkType.MAINNET ? 'ton' : 'tton',
1072+
network: coin.network.type === NetworkType.MAINNET ? 'Mainnet' : 'Testnet',
1073+
name: coin.fullName,
1074+
contractAddress: coin.contractAddress,
1075+
decimalPlaces: coin.decimalPlaces,
1076+
};
1077+
}
1078+
1079+
const getFormattedJettonTokens = (customCoinMap = coins) =>
1080+
customCoinMap.reduce((acc: JettonTokenConfig[], coin) => {
1081+
if (coin instanceof JettonToken) {
1082+
acc.push(getJettonTokenConfig(coin));
1083+
}
1084+
return acc;
1085+
}, []);
1086+
10561087
export const getFormattedTokens = (coinMap = coins): Tokens => {
10571088
const formattedAptNFTCollections = getFormattedAptNFTCollections(coinMap);
10581089
const formattedVetNFTCollections = getFormattedVetNFTCollections(coinMap);
@@ -1157,6 +1188,9 @@ export const getFormattedTokens = (coinMap = coins): Tokens => {
11571188
cosmos: {
11581189
tokens: getFormattedCosmosChainTokens(coinMap).filter((token) => token.network === 'Mainnet'),
11591190
},
1191+
ton: {
1192+
tokens: getFormattedJettonTokens(coinMap).filter((token) => token.network === 'Mainnet'),
1193+
},
11601194
},
11611195
testnet: {
11621196
eth: {
@@ -1258,6 +1292,9 @@ export const getFormattedTokens = (coinMap = coins): Tokens => {
12581292
cosmos: {
12591293
tokens: getFormattedCosmosChainTokens(coinMap).filter((token) => token.network === 'Testnet'),
12601294
},
1295+
ton: {
1296+
tokens: getFormattedJettonTokens(coinMap).filter((token) => token.network === 'Testnet'),
1297+
},
12611298
},
12621299
};
12631300
};
@@ -1369,6 +1406,8 @@ export function getFormattedTokenConfigForCoin(coin: Readonly<BaseCoin>): TokenC
13691406
return getVetNFTCollectionConfig(coin);
13701407
} else if (coin instanceof CoredaoERC20Token) {
13711408
return getCoredaoTokenConfig(coin);
1409+
} else if (coin instanceof JettonToken) {
1410+
return getJettonTokenConfig(coin);
13721411
}
13731412
return undefined;
13741413
}

0 commit comments

Comments
 (0)