From e9e720bd6e91d5a0fea9cdfcf36ba4e67fea321a Mon Sep 17 00:00:00 2001 From: Mohammed Ryaan Date: Mon, 15 Sep 2025 14:05:35 +0530 Subject: [PATCH] feat: onboard testnet ton tokens TICKET: COIN-5624 --- modules/sdk-coin-ton/test/unit/jettonToken.ts | 33 +++++++++++++++++++ modules/statics/src/allCoinsAndTokens.ts | 2 ++ modules/statics/src/base.ts | 3 ++ modules/statics/src/coinFeatures.ts | 7 ++++ modules/statics/src/coins.ts | 2 ++ modules/statics/src/coins/jettonTokens.ts | 16 +++++++++ 6 files changed, 63 insertions(+) create mode 100644 modules/sdk-coin-ton/test/unit/jettonToken.ts create mode 100644 modules/statics/src/coins/jettonTokens.ts diff --git a/modules/sdk-coin-ton/test/unit/jettonToken.ts b/modules/sdk-coin-ton/test/unit/jettonToken.ts new file mode 100644 index 0000000000..05a8707b43 --- /dev/null +++ b/modules/sdk-coin-ton/test/unit/jettonToken.ts @@ -0,0 +1,33 @@ +import 'should'; + +import { TestBitGo, TestBitGoAPI } from '@bitgo/sdk-test'; +import { BitGoAPI } from '@bitgo/sdk-api'; +import { JettonToken } from '../../src'; + +describe('Jetton Tokens', function () { + let bitgo: TestBitGoAPI; + let testnetJettonToken; + const testnetTokenName = 'tton:ukwny-us'; + + before(function () { + bitgo = TestBitGo.decorate(BitGoAPI, { env: 'test' }); + JettonToken.createTokenConstructors().forEach(({ name, coinConstructor }) => { + bitgo.safeRegister(name, coinConstructor); + }); + bitgo.initializeTestVars(); + testnetJettonToken = bitgo.coin(testnetTokenName); + }); + + it('should return constants for Testnet Ton token', function () { + testnetJettonToken.getChain().should.equal(testnetTokenName); + testnetJettonToken.getBaseChain().should.equal('tton'); + testnetJettonToken.getFullName().should.equal('Ton Token'); + testnetJettonToken.getBaseFactor().should.equal(1e9); + testnetJettonToken.type.should.equal(testnetTokenName); + testnetJettonToken.name.should.equal('Test Unknown TokenY-US'); + testnetJettonToken.coin.should.equal('tton'); + testnetJettonToken.network.should.equal('Testnet'); + testnetJettonToken.contractAddress.should.equal('kQD8EQMavE1w6gvgMXUhN8hi7pSk4bKYM-W2dgkNqV54Y16Y'); + testnetJettonToken.decimalPlaces.should.equal(9); + }); +}); diff --git a/modules/statics/src/allCoinsAndTokens.ts b/modules/statics/src/allCoinsAndTokens.ts index 95ec650692..f587a5b33c 100644 --- a/modules/statics/src/allCoinsAndTokens.ts +++ b/modules/statics/src/allCoinsAndTokens.ts @@ -63,6 +63,7 @@ import { sip10Tokens } from './coins/sip10Tokens'; import { nep141Tokens } from './coins/nep141Tokens'; import { vetTokens } from './coins/vetTokens'; import { cosmosTokens } from './coins/cosmosTokens'; +import { jettonTokens } from './coins/jettonTokens'; import { flrp } from './flrp'; import { ADA_FEATURES_WITH_FRANKFURT, @@ -146,6 +147,7 @@ export const allCoinsAndTokens = [ ...botTokens, ...botOfcTokens, ...adaTokens, + ...jettonTokens, avaxp( '5436386e-9e4d-4d82-92df-59d9720d1738', 'avaxp', diff --git a/modules/statics/src/base.ts b/modules/statics/src/base.ts index 94a670a45b..e214f71664 100644 --- a/modules/statics/src/base.ts +++ b/modules/statics/src/base.ts @@ -3116,6 +3116,9 @@ export enum UnderlyingAsset { // COSMOS testnet tokens 'thash:ylds' = 'thash:ylds', + // TON testnet tokens + 'tton:ukwny-us' = 'tton:ukwny-us', + 'eth:0x0' = 'eth:0x0', 'eth:vvs' = 'eth:vvs', 'eth:bmx' = 'eth:bmx', diff --git a/modules/statics/src/coinFeatures.ts b/modules/statics/src/coinFeatures.ts index 91786a3df5..5c443814d9 100644 --- a/modules/statics/src/coinFeatures.ts +++ b/modules/statics/src/coinFeatures.ts @@ -430,6 +430,13 @@ export const TON_FEATURES = [ CoinFeature.ALPHANUMERIC_MEMO_ID, CoinFeature.SUPPORTS_TOKENS, ]; +export const TON_TOKEN_FEATURES = [ + ...ACCOUNT_COIN_DEFAULT_FEATURES, + CoinFeature.TSS, + CoinFeature.TSS_COLD, + CoinFeature.REBUILD_ON_CUSTODY_SIGNING, + CoinFeature.ALPHANUMERIC_MEMO_ID, +]; export const ARBETH_FEATURES = [ ...ETH_FEATURES, CoinFeature.TSS, diff --git a/modules/statics/src/coins.ts b/modules/statics/src/coins.ts index dfba508d83..d3467b00bf 100644 --- a/modules/statics/src/coins.ts +++ b/modules/statics/src/coins.ts @@ -11,6 +11,7 @@ import { eosToken, erc20, hederaToken, + jettonToken, nep141Token, opethErc20, polygonErc20, @@ -65,6 +66,7 @@ export function createToken(token: AmsTokenConfig): Readonly | undefin xrp: xrpToken, ofc: ofcToken, ada: adaToken, + ton: jettonToken, }; //return the BaseCoin from default coin map if present diff --git a/modules/statics/src/coins/jettonTokens.ts b/modules/statics/src/coins/jettonTokens.ts new file mode 100644 index 0000000000..fd0b168770 --- /dev/null +++ b/modules/statics/src/coins/jettonTokens.ts @@ -0,0 +1,16 @@ +import { tjettonToken } from '../account'; +import { UnderlyingAsset } from '../base'; +import { TON_TOKEN_FEATURES } from '../coinFeatures'; + +export const jettonTokens = [ + // testnet tokens + tjettonToken( + 'a442d4fc-bc65-4ef5-92eb-fbefdd1f991f', + 'tton:ukwny-us', + 'Test Unknown TokenY-US', + 9, + 'kQD8EQMavE1w6gvgMXUhN8hi7pSk4bKYM-W2dgkNqV54Y16Y', + UnderlyingAsset['tton:ukwny-us'], + TON_TOKEN_FEATURES + ), +];