Skip to content

Commit 1dba482

Browse files
Merge pull request #7747 from BitGo/COIN-6857
feat: added support for ftm
2 parents 1a5bc7e + 365435f commit 1dba482

File tree

8 files changed

+73
-0
lines changed

8 files changed

+73
-0
lines changed

modules/bitgo/src/v2/coinFactory.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,9 +260,11 @@ export function registerCoinConstructors(coinFactory: CoinFactory, coinMap: Coin
260260
coinFactory.register('ethw', Ethw.createInstance);
261261
coinFactory.register('baseeth', EthLikeCoin.createInstance);
262262
coinFactory.register('opbnb', EthLikeCoin.createInstance);
263+
coinFactory.register('fantom', EthLikeCoin.createInstance);
263264
coinFactory.register('og', EthLikeCoin.createInstance);
264265
coinFactory.register('tog', EthLikeCoin.createInstance);
265266
coinFactory.register('topbnb', TethLikeCoin.createInstance);
267+
coinFactory.register('tfantom', TethLikeCoin.createInstance);
266268
coinFactory.register('tbaseeth', TethLikeCoin.createInstance);
267269
coinFactory.register('fiataed', FiatAED.createInstance);
268270
coinFactory.register('fiateur', FiatEur.createInstance);
@@ -645,10 +647,14 @@ export function getCoinConstructor(coinName: string): CoinConstructor | undefine
645647
return EthLikeCoin.createInstance;
646648
case 'opbnb':
647649
return EthLikeCoin.createInstance;
650+
case 'fantom':
651+
return EthLikeCoin.createInstance;
648652
case 'tbaseeth':
649653
return TethLikeCoin.createInstance;
650654
case 'topbnb':
651655
return TethLikeCoin.createInstance;
656+
case 'tfantom':
657+
return TethLikeCoin.createInstance;
652658
case 'fiataed':
653659
return FiatAED.createInstance;
654660
case 'fiateur':

modules/sdk-coin-ethlike/test/fixtures/ethlikeCoin.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ export const ccr = {
7575
'0x02f901d38215eb01843b9aca00843b9aca00830186a0948ce59c2d1702844f8eded451aa103961bc37b4e880b90164391252150000000000000000000000002c2b9c9a4a25e24b174f26114e8926a9f2128fe40000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000006939c792000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041833fbbdb8457ee22924b2ad59becbd1629481ca2bf10b9c66dba45e6fbd8fe1f62fc94c6a3a0a8915abe7df7ce9cf2b3d43b0e46f539d11f00cbe9c5aa2dfbe71c00000000000000000000000000000000000000000000000000000000000000c080a05614c8ae83fee9c0d95334114103aa4fee94f574dd55497f41f532d98ce95100a0102dbe65dcd4034fbf2c2e997758180f15e8c626fb9df4f1695a7fa01dbb376e',
7676
txid: '0x48052a9408a20f317b938dbcd7c30c6019c19571ed07ded11853bae9f16493fd',
7777
},
78+
tfantom: {
79+
txHex:
80+
'0x02f901d3820fa201843b9aca00843b9aca00830186a0948ce59c2d1702844f8eded451aa103961bc37b4e880b90164391252150000000000000000000000002c2b9c9a4a25e24b174f26114e8926a9f2128fe40000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000006939c792000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041833fbbdb8457ee22924b2ad59becbd1629481ca2bf10b9c66dba45e6fbd8fe1f62fc94c6a3a0a8915abe7df7ce9cf2b3d43b0e46f539d11f00cbe9c5aa2dfbe71c00000000000000000000000000000000000000000000000000000000000000c080a05614c8ae83fee9c0d95334114103aa4fee94f574dd55497f41f532d98ce95100a0102dbe65dcd4034fbf2c2e997758180f15e8c626fb9df4f1695a7fa01dbb376e',
81+
txid: '0x58062b9508b30f417c948ebce7d30d6029d29681fe17eed21963cbe9f26593fe',
82+
},
7883
};
7984
export const encryptedUserKey =
8085
'{"iv":"VFZ3jvXhxo1Z+Yaf2MtZnA==","v":1,"iter":10000,"ks":256,"ts":64,"mode"\n' +
@@ -107,4 +112,12 @@ export const custodialHot = {
107112
signedTxHex:
108113
'0xf9016a80830186a082520894702cf81e03aa310ec9481d814e3d04a20b04b50580b901440dcd7a6c000000000000000000000000b9f62c71d5f6949cfb211a67fb13ccf079cc760b0000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000e4ab69c077896252fafbd49efd26b5d171a324100000000000000000000000000000000000000000000000000000000067f415e1000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000041a9c3ead37547fa56b694e4eccc9352225b7458ef08e4e961ca5774d398abd55b5986a7446259374d2098012923583935189739f18dd117c4d15221b2a26f50911c00000000000000000000000000000000000000000000000000000000000000822bf98080',
109114
},
115+
tfantom: {
116+
signatureData:
117+
'0dcd7a6c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000b9f62c71d5f6949cfb211a67fb13ccf079cc760b0000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000e4ab69c077896252fafbd49efd26b5d171a324100000000000000000000000000000000000000000000000000000000067f415e10000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000a343030322d45524332300000000000000000000000000000000000000000000000',
118+
signature:
119+
'0xa9c3ead37547fa56b694e4eccc9352225b7458ef08e4e961ca5774d398abd55b5986a7446259374d2098012923583935189739f18dd117c4d15221b2a26f50911c',
120+
signedTxHex:
121+
'0xf9016a80830186a082520894702cf81e03aa310ec9481d814e3d04a20b04b50580b901440dcd7a6c000000000000000000000000b9f62c71d5f6949cfb211a67fb13ccf079cc760b0000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000e4ab69c077896252fafbd49efd26b5d171a324100000000000000000000000000000000000000000000000000000000067f415e1000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000041a9c3ead37547fa56b694e4eccc9352225b7458ef08e4e961ca5774d398abd55b5986a7446259374d2098012923583935189739f18dd117c4d15221b2a26f50911c00000000000000000000000000000000000000000000000000000000000000821f678080',
122+
},
110123
};

modules/sdk-coin-ethlike/test/unit/ethlikeCoin.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ const coins = [
2626
name: 'topbnb',
2727
common: getCommon('topbnb'),
2828
},
29+
{
30+
name: 'tfantom',
31+
common: getCommon('tfantom'),
32+
},
2933
];
3034

3135
describe('EthLike coin tests', function () {

modules/sdk-core/src/bitgo/environments.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,10 @@ const mainnetBase: EnvironmentTemplate = {
265265
baseUrl: 'https://api.etherscan.io/v2',
266266
apiToken: process.env.ETHERSCAN_API_TOKEN,
267267
},
268+
fantom: {
269+
baseUrl: 'https://explorer.fantom.network',
270+
rpcUrl: 'https://rpcapi.fantom.network/',
271+
},
268272
flow: {
269273
baseUrl: 'https://evm.flowscan.io',
270274
},

modules/statics/src/allCoinsAndTokens.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,26 @@ export const allCoinsAndTokens = [
447447
BaseUnit.ETH,
448448
[...ETH_FEATURES, CoinFeature.USES_NON_PACKED_ENCODING_FOR_TXDATA, CoinFeature.EIP1559]
449449
),
450+
account(
451+
'a97b6e81-33fb-4f63-83b6-7ca91e95f8b4',
452+
'tfantom',
453+
'Fantom Testnet',
454+
Networks.test.fantom,
455+
18,
456+
UnderlyingAsset.FANTOM,
457+
BaseUnit.ETH,
458+
[...ETH_FEATURES, CoinFeature.USES_NON_PACKED_ENCODING_FOR_TXDATA, CoinFeature.EIP1559]
459+
),
460+
account(
461+
'06178542-d2e1-4626-bd46-6a4aaa45415e',
462+
'fantom',
463+
'Fantom Mainnet',
464+
Networks.main.fantom,
465+
18,
466+
UnderlyingAsset.FANTOM,
467+
BaseUnit.ETH,
468+
[...ETH_FEATURES, CoinFeature.USES_NON_PACKED_ENCODING_FOR_TXDATA, CoinFeature.EIP1559]
469+
),
450470
account(
451471
'ffc472f5-27c6-49f8-ad9a-f57659258fb9',
452472
'etc',

modules/statics/src/base.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export enum CoinFamily {
5757
FETCHAI = 'fetchai',
5858
FIAT = 'fiat',
5959
FLOW = 'flow',
60+
FANTOM = 'fantom', // Fantom
6061
FLR = 'flr',
6162
FLRP = 'flrp',
6263
HASH = 'hash', // Provenance
@@ -571,6 +572,7 @@ export enum UnderlyingAsset {
571572
FLR = 'flr',
572573
FLRP = 'flrp',
573574
FLUENTETH = 'fluenteth',
575+
FANTOM = 'fantom', // Fantom
574576
GTC = 'gtc',
575577
HASH = 'hash', // Provenance
576578
HBAR = 'hbar', // Hedera main coin

modules/statics/src/networks.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,26 @@ class OpBNBTestnet extends Testnet implements EthereumNetwork {
398398
tokenOperationHashPrefix = '5611-ERC20';
399399
}
400400

401+
class Fantom extends Mainnet implements EthereumNetwork {
402+
name = 'Fantom';
403+
family = CoinFamily.FANTOM;
404+
explorerUrl = 'https://explorer.fantom.network/transactions/';
405+
accountExplorerUrl = 'https://explorer.fantom.network/address/';
406+
chainId = 250;
407+
nativeCoinOperationHashPrefix = '250';
408+
tokenOperationHashPrefix = '250-ERC20';
409+
}
410+
411+
class FantomTestnet extends Testnet implements EthereumNetwork {
412+
name = 'FantomTestnet';
413+
family = CoinFamily.FANTOM;
414+
explorerUrl = 'https://explorer.fantom.network/transactions/';
415+
accountExplorerUrl = 'https://explorer.fantom.network/address/';
416+
chainId = 4002;
417+
nativeCoinOperationHashPrefix = '4002';
418+
tokenOperationHashPrefix = '4002-ERC20';
419+
}
420+
401421
class LightningBitcoin extends Mainnet implements LightningNetwork {
402422
name = 'LightningBitcoin';
403423
family = CoinFamily.LNBTC;
@@ -2274,6 +2294,7 @@ export const Networks = {
22742294
ofc: Object.freeze(new Ofc()),
22752295
okb: Object.freeze(new Xlayer()),
22762296
opbnb: Object.freeze(new OpBNB()),
2297+
fantom: Object.freeze(new Fantom()),
22772298
morph: Object.freeze(new Morph()),
22782299
optimism: Object.freeze(new Optimism()),
22792300
osmo: Object.freeze(new Osmo()),
@@ -2382,6 +2403,7 @@ export const Networks = {
23822403
ofc: Object.freeze(new OfcTestnet()),
23832404
okb: Object.freeze(new XlayerTestnet()),
23842405
opbnb: Object.freeze(new OpBNBTestnet()),
2406+
fantom: Object.freeze(new FantomTestnet()),
23852407
morph: Object.freeze(new MorphTestnet()),
23862408
optimism: Object.freeze(new OptimismTestnet()),
23872409
osmo: Object.freeze(new OsmoTestnet()),

modules/statics/test/unit/fixtures/expectedColdFeatures.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,8 @@ export const expectedColdFeatures = {
202202
],
203203
neither: [
204204
'ethw',
205+
'fantom',
206+
'tfantom',
205207
'opbnb',
206208
'topbnb',
207209
'fiataed',

0 commit comments

Comments
 (0)