Skip to content

Commit 0d00cbf

Browse files
authored
feat(bitgo): add method to register single token from ams in coin factory
2 parents a32b05a + 278243e commit 0d00cbf

File tree

3 files changed

+143
-5
lines changed

3 files changed

+143
-5
lines changed

modules/bitgo/src/bitgo.ts

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,13 @@ import * as _ from 'lodash';
88

99
import { BaseCoin, CoinFactory, common } from '@bitgo/sdk-core';
1010
import { BitGoAPI, BitGoAPIOptions } from '@bitgo/sdk-api';
11-
import { createTokenMapUsingTrimmedConfigDetails, TrimmedAmsTokenConfig } from '@bitgo/statics';
12-
import { GlobalCoinFactory, registerCoinConstructors } from './v2/coinFactory';
11+
import {
12+
createTokenMapUsingTrimmedConfigDetails,
13+
TrimmedAmsTokenConfig,
14+
createToken,
15+
getFormattedTokenConfigForCoin,
16+
} from '@bitgo/statics';
17+
import { GlobalCoinFactory, registerCoinConstructors, getTokenConstructor } from './v2/coinFactory';
1318

1419
// constructor params used exclusively for BitGo class
1520
export type BitGoOptions = BitGoAPIOptions & {
@@ -56,8 +61,12 @@ export class BitGo extends BitGoAPI {
5661
this._coinFactory = new CoinFactory();
5762
}
5863

64+
/**
65+
* Initialize the coin factory with token configurations
66+
* @param tokenConfigMap - A map of token metadata from AMS
67+
*/
5968
initCoinFactory(tokenConfigMap: Record<string, TrimmedAmsTokenConfig[]>): void {
60-
// TODO(WIN-5057): use AMS endpoint to fetch config details
69+
// TODO(WIN-5839): use AMS endpoint to fetch config details
6170
const coinMap = createTokenMapUsingTrimmedConfigDetails(tokenConfigMap);
6271
this._coinFactory = new CoinFactory();
6372
registerCoinConstructors(this._coinFactory, coinMap);
@@ -74,6 +83,27 @@ export class BitGo extends BitGoAPI {
7483
return GlobalCoinFactory.getInstance(this, coinName);
7584
}
7685

86+
/**
87+
* Register a token in the coin factory
88+
* @param tokenConfig - The token metadata from AMS
89+
*/
90+
registerToken(tokenConfig: TrimmedAmsTokenConfig): void {
91+
if (!this._useAms) {
92+
throw new Error('registerToken is only supported when useAms is set to true');
93+
}
94+
// TODO(WIN-5839): use AMS endpoint to fetch token metadata
95+
const staticsBaseCoin = createToken(tokenConfig);
96+
if (staticsBaseCoin) {
97+
const formattedTokenConfig = getFormattedTokenConfigForCoin(staticsBaseCoin);
98+
if (formattedTokenConfig) {
99+
const tokenConstructor = getTokenConstructor(formattedTokenConfig);
100+
if (tokenConstructor) {
101+
this._coinFactory.registerToken(staticsBaseCoin, tokenConstructor);
102+
}
103+
}
104+
}
105+
}
106+
77107
/**
78108
* Create a basecoin object for a virtual token
79109
* @param tokenName

modules/bitgo/src/v2/coinFactory.ts

Lines changed: 98 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,29 @@ import { HbarToken } from '@bitgo/sdk-coin-hbar';
88
import { Near, TNear, Nep141Token } from '@bitgo/sdk-coin-near';
99
import { SolToken } from '@bitgo/sdk-coin-sol';
1010
import { TrxToken } from '@bitgo/sdk-coin-trx';
11-
import { CoinFactory } from '@bitgo/sdk-core';
12-
import { CoinMap, coins, getFormattedTokens } from '@bitgo/statics';
11+
import { CoinFactory, CoinConstructor } from '@bitgo/sdk-core';
12+
import {
13+
CoinMap,
14+
coins,
15+
getFormattedTokens,
16+
TokenConfig,
17+
Erc20TokenConfig,
18+
StellarTokenConfig,
19+
OfcTokenConfig,
20+
CeloTokenConfig,
21+
EthLikeTokenConfig,
22+
EosTokenConfig,
23+
AvaxcTokenConfig,
24+
SolTokenConfig,
25+
HbarTokenConfig,
26+
AdaTokenConfig,
27+
AlgoTokenConfig,
28+
TrxTokenConfig,
29+
XrpTokenConfig,
30+
SuiTokenConfig,
31+
AptTokenConfig,
32+
Sip10TokenConfig,
33+
} from '@bitgo/statics';
1334
import {
1435
Ada,
1536
Algo,
@@ -457,6 +478,81 @@ export function registerCoinConstructors(coinFactory: CoinFactory, coinMap: Coin
457478
);
458479
}
459480

481+
export function getTokenConstructor(tokenConfig: TokenConfig): CoinConstructor | undefined {
482+
switch (tokenConfig.coin) {
483+
case 'eth':
484+
case 'hteth':
485+
return Erc20Token.createTokenConstructor(tokenConfig as Erc20TokenConfig);
486+
case 'xlm':
487+
case 'txlm':
488+
return StellarToken.createTokenConstructor(tokenConfig as StellarTokenConfig);
489+
case 'ofc':
490+
return OfcToken.createTokenConstructor(tokenConfig as OfcTokenConfig);
491+
case 'celo':
492+
case 'tcelo':
493+
return CeloToken.createTokenConstructor(tokenConfig as CeloTokenConfig);
494+
case 'bsc':
495+
case 'tbsc':
496+
return BscToken.createTokenConstructor(tokenConfig as Erc20TokenConfig);
497+
case 'eos':
498+
case 'teos':
499+
return EosToken.createTokenConstructor(tokenConfig as EosTokenConfig);
500+
case 'algo':
501+
case 'talgo':
502+
return AlgoToken.createTokenConstructor(tokenConfig as AlgoTokenConfig);
503+
case 'avaxc':
504+
case 'tavaxc':
505+
return AvaxCToken.createTokenConstructor(tokenConfig as AvaxcTokenConfig);
506+
case 'polygon':
507+
case 'tpolygon':
508+
return PolygonToken.createTokenConstructor(tokenConfig as EthLikeTokenConfig);
509+
case 'soneium':
510+
case 'tsoneium':
511+
return SoneiumToken.createTokenConstructor(tokenConfig as EthLikeTokenConfig);
512+
case 'arbeth':
513+
case 'tarbeth':
514+
return ArbethToken.createTokenConstructor(tokenConfig as EthLikeTokenConfig);
515+
case 'opeth':
516+
case 'topeth':
517+
return OpethToken.createTokenConstructor(tokenConfig as EthLikeTokenConfig);
518+
case 'zketh':
519+
case 'tzketh':
520+
return ZkethToken.createTokenConstructor(tokenConfig as EthLikeTokenConfig);
521+
case 'bera':
522+
case 'tbera':
523+
return BeraToken.createTokenConstructor(tokenConfig as EthLikeTokenConfig);
524+
case 'coredao':
525+
case 'tcoredao':
526+
return CoredaoToken.createTokenConstructor(tokenConfig as EthLikeTokenConfig);
527+
case 'sol':
528+
case 'tsol':
529+
return SolToken.createTokenConstructor(tokenConfig as SolTokenConfig);
530+
case 'hbar':
531+
case 'thbar':
532+
return HbarToken.createTokenConstructor(tokenConfig as HbarTokenConfig);
533+
case 'trx':
534+
case 'ttrx':
535+
return TrxToken.createTokenConstructor(tokenConfig as TrxTokenConfig);
536+
case 'ada':
537+
case 'tada':
538+
return AdaToken.createTokenConstructor(tokenConfig as AdaTokenConfig);
539+
case 'sui':
540+
case 'tsui':
541+
return SuiToken.createTokenConstructor(tokenConfig as SuiTokenConfig);
542+
case 'xrp':
543+
case 'txrp':
544+
return XrpToken.createTokenConstructor(tokenConfig as XrpTokenConfig);
545+
case 'apt':
546+
case 'tapt':
547+
return AptToken.createTokenConstructor(tokenConfig as AptTokenConfig);
548+
case 'sip10':
549+
case 'tsip10':
550+
return Sip10Token.createTokenConstructor(tokenConfig as Sip10TokenConfig);
551+
default:
552+
return undefined;
553+
}
554+
}
555+
460556
export const GlobalCoinFactory: CoinFactory = new CoinFactory();
461557

462558
registerCoinConstructors(GlobalCoinFactory);

modules/bitgo/test/v2/unit/ams/ams.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,16 @@ describe('Asset metadata service', () => {
3333
'Coin or token type hteth:faketoken not supported or not compiled. Please be sure that you are using the latest version of BitGoJS. If using @bitgo/sdk-api, please confirm you have registered hteth:faketoken first.'
3434
);
3535
});
36+
37+
it('should be able to register a token in the coin factory', () => {
38+
const tokenName = 'hteth:faketoken';
39+
const amsToken = reducedAmsTokenConfig[tokenName][0];
40+
bitgo.registerToken(amsToken);
41+
const coin = bitgo.coin(tokenName);
42+
should.exist(coin);
43+
coin.type.should.equal(tokenName);
44+
coin.name.should.equal('Holesky Testnet fake token');
45+
coin.decimalPlaces.should.equal(6);
46+
coin.tokenContractAddress.should.equal('0x89a959b9184b4f8c8633646d5dfd049d2ebc983a');
47+
});
3648
});

0 commit comments

Comments
 (0)