From 596f5e506c61c7b93e8b0c24b8b29441ba3062ca Mon Sep 17 00:00:00 2001 From: Alok Baltiyal Date: Fri, 24 Jan 2025 12:33:07 +0530 Subject: [PATCH] feat(sdk-coin-apt): add Apt Token Skeleton TICKET: COIN-2889 --- modules/sdk-coin-apt/src/aptToken.ts | 62 ++++++++++++++++++++++++++++ modules/sdk-coin-apt/src/index.ts | 1 + modules/sdk-coin-apt/src/register.ts | 4 ++ modules/statics/src/index.ts | 1 + modules/statics/src/tokenConfig.ts | 31 ++++++++++++++ 5 files changed, 99 insertions(+) create mode 100644 modules/sdk-coin-apt/src/aptToken.ts diff --git a/modules/sdk-coin-apt/src/aptToken.ts b/modules/sdk-coin-apt/src/aptToken.ts new file mode 100644 index 0000000000..d8aaf936a0 --- /dev/null +++ b/modules/sdk-coin-apt/src/aptToken.ts @@ -0,0 +1,62 @@ +import { Apt } from './apt'; +import { BitGoBase, CoinConstructor, NamedCoinConstructor } from '@bitgo/sdk-core'; +import { AptTokenConfig, coins, tokens } from '@bitgo/statics'; + +export class AptToken extends Apt { + public readonly tokenConfig: AptTokenConfig; + + constructor(bitgo: BitGoBase, tokenConfig: AptTokenConfig) { + const staticsCoin = tokenConfig.network === 'Mainnet' ? coins.get('apt') : coins.get('tapt'); + super(bitgo, staticsCoin); + this.tokenConfig = tokenConfig; + } + + static createTokenConstructor(config: AptTokenConfig): CoinConstructor { + return (bitgo: BitGoBase) => new AptToken(bitgo, config); + } + + static createTokenConstructors(): NamedCoinConstructor[] { + const tokensCtors: NamedCoinConstructor[] = []; + for (const token of [...tokens.bitcoin.apt.tokens, ...tokens.testnet.apt.tokens]) { + const tokenConstructor = AptToken.createTokenConstructor(token); + tokensCtors.push({ name: token.type, coinConstructor: tokenConstructor }); + } + return tokensCtors; + } + + get name(): string { + return this.tokenConfig.name; + } + + get coin(): string { + return this.tokenConfig.coin; + } + + get network(): string { + return this.tokenConfig.network; + } + + get fungibleAssestAddress(): string { + return this.tokenConfig.fungibleAssetAddress; + } + + get decimalPlaces(): number { + return this.tokenConfig.decimalPlaces; + } + + getChain(): string { + return this.tokenConfig.type; + } + + getBaseChain(): string { + return this.coin; + } + + getFullName(): string { + return 'Apt Token'; + } + + getBaseFactor(): number { + return Math.pow(10, this.tokenConfig.decimalPlaces); + } +} diff --git a/modules/sdk-coin-apt/src/index.ts b/modules/sdk-coin-apt/src/index.ts index dd32f56cfd..287b6bf223 100644 --- a/modules/sdk-coin-apt/src/index.ts +++ b/modules/sdk-coin-apt/src/index.ts @@ -2,3 +2,4 @@ export * from './lib'; export * from './register'; export * from './apt'; export * from './tapt'; +export * from './aptToken'; diff --git a/modules/sdk-coin-apt/src/register.ts b/modules/sdk-coin-apt/src/register.ts index 8a9ab8e73e..3ff4d16866 100644 --- a/modules/sdk-coin-apt/src/register.ts +++ b/modules/sdk-coin-apt/src/register.ts @@ -1,8 +1,12 @@ import { BitGoBase } from '@bitgo/sdk-core'; import { Apt } from './apt'; import { Tapt } from './tapt'; +import { AptToken } from './aptToken'; export const register = (sdk: BitGoBase): void => { sdk.register('apt', Apt.createInstance); sdk.register('tapt', Tapt.createInstance); + AptToken.createTokenConstructors().forEach(({ name, coinConstructor }) => { + sdk.register(name, coinConstructor); + }); }; diff --git a/modules/statics/src/index.ts b/modules/statics/src/index.ts index 335146c5fc..fc586f1431 100644 --- a/modules/statics/src/index.ts +++ b/modules/statics/src/index.ts @@ -20,5 +20,6 @@ export { TronErc20Coin, SuiCoin, XrpCoin, + AptCoin, } from './account'; export { CoinMap } from './map'; diff --git a/modules/statics/src/tokenConfig.ts b/modules/statics/src/tokenConfig.ts index 3e5a0a893b..4b99346401 100644 --- a/modules/statics/src/tokenConfig.ts +++ b/modules/statics/src/tokenConfig.ts @@ -19,6 +19,7 @@ import { ZkethERC20Token, SuiCoin, BeraERC20Token, + AptCoin, } from './account'; import { CoinFamily, CoinKind } from './base'; import { coins } from './coins'; @@ -80,6 +81,10 @@ export type SuiTokenConfig = BaseNetworkConfig & { symbol: string; }; +export type AptTokenConfig = BaseNetworkConfig & { + fungibleAssetAddress: string; +}; + export interface Tokens { bitcoin: { eth: { @@ -139,6 +144,9 @@ export interface Tokens { bera: { tokens: EthLikeTokenConfig[]; }; + apt: { + tokens: AptTokenConfig[]; + }; }; testnet: { eth: { @@ -198,6 +206,9 @@ export interface Tokens { bera: { tokens: EthLikeTokenConfig[]; }; + apt: { + tokens: AptTokenConfig[]; + }; }; } @@ -505,6 +516,20 @@ const formattedSuiTokens = coins.reduce((acc: SuiTokenConfig[], coin) => { return acc; }, []); +const formattedAptTokens = coins.reduce((acc: AptTokenConfig[], coin) => { + if (coin instanceof AptCoin) { + acc.push({ + type: coin.name, + coin: coin.network.type === NetworkType.MAINNET ? 'apt' : 'tapt', + network: coin.network.type === NetworkType.MAINNET ? 'Mainnet' : 'Testnet', + name: coin.fullName, + fungibleAssetAddress: coin.fungibleAssetAddress, + decimalPlaces: coin.decimalPlaces, + }); + } + return acc; +}, []); + export const tokens: Tokens = { // network name for production environments bitcoin: { @@ -565,6 +590,9 @@ export const tokens: Tokens = { bera: { tokens: formattedBeraTokens.filter((token) => token.network === 'Mainnet'), }, + apt: { + tokens: formattedAptTokens.filter((token) => token.network === 'Testnet'), + }, }, // network name for test environments testnet: { @@ -625,6 +653,9 @@ export const tokens: Tokens = { bera: { tokens: formattedBeraTokens.filter((token) => token.network === 'Testnet'), }, + apt: { + tokens: formattedAptTokens.filter((token) => token.network === 'Testnet'), + }, }, };