From 941a50997daf1e957401676436f958b3b591d2e8 Mon Sep 17 00:00:00 2001 From: abhi-bitgo Date: Thu, 19 Feb 2026 20:45:42 +0530 Subject: [PATCH] feat: add generator function for erc20 ticket: WIN-8460 --- modules/statics/src/coins/generateERC20.ts | 138 +++++++++++++++++++++ modules/statics/src/index.ts | 6 + 2 files changed, 144 insertions(+) create mode 100644 modules/statics/src/coins/generateERC20.ts diff --git a/modules/statics/src/coins/generateERC20.ts b/modules/statics/src/coins/generateERC20.ts new file mode 100644 index 0000000000..d2005f9c6e --- /dev/null +++ b/modules/statics/src/coins/generateERC20.ts @@ -0,0 +1,138 @@ +import { erc20, erc20Token, terc20 } from '../account'; +import { CoinFeature, UnderlyingAsset } from '../base'; +import { AccountNetwork, EthereumNetwork } from '../networks'; +import { ofcerc20, tofcerc20 } from '../ofc'; + +// --- Shared config interfaces --- + +interface BaseErc20Config { + id: string; + name: string; + fullName: string; + decimalPlaces: number; + contractAddress: string; + asset: UnderlyingAsset; + features?: CoinFeature[]; + prefix?: string; + suffix?: string; +} + +interface Erc20WithOfcConfig extends BaseErc20Config { + ofcId: string; + ofcName: string; + ofcAddressCoin?: string; + skipOfc?: false; +} + +interface Erc20WithoutOfcConfig extends BaseErc20Config { + skipOfc: true; +} + +type Erc20Config = Erc20WithOfcConfig | Erc20WithoutOfcConfig; + +type Erc20CoinConfig = Erc20Config & { network?: EthereumNetwork }; +type Erc20TokenConfig = Erc20Config & { network: AccountNetwork }; + +function createOfcCoin( + config: Erc20WithOfcConfig, + onchainFeatures: CoinFeature[], + defaultAddressCoin: string, + isTestnet: boolean +) { + const ofcFn = isTestnet ? tofcerc20 : ofcerc20; + + return ofcFn( + config.ofcId, + config.ofcName, + config.fullName, + config.decimalPlaces, + config.asset, + undefined, // kind + undefined, + undefined, // prefix + undefined, // suffix + undefined, // network + true, // isToken + config.ofcAddressCoin ?? defaultAddressCoin + ); +} + +// --- Ethereum ERC20 generators (erc20 / terc20) --- + +export function generateErc20Coin(config: Erc20CoinConfig) { + const onChain = erc20( + config.id, + config.name, + config.fullName, + config.decimalPlaces, + config.contractAddress, + config.asset, + config.features, + config.prefix, + config.suffix, + config.network + ); + + if (config.skipOfc) return [onChain]; + + return [onChain, createOfcCoin(config, onChain.features, 'eth', false)]; +} + +export function generateTestErc20Coin(config: Erc20CoinConfig) { + const onChain = terc20( + config.id, + config.name, + config.fullName, + config.decimalPlaces, + config.contractAddress, + config.asset, + config.features, + config.prefix, + config.suffix, + config.network + ); + + if (config.skipOfc) return [onChain]; + + return [onChain, createOfcCoin(config, onChain.features, 'teth', true)]; +} + +// --- ERC20 Token generators (erc20Token for non-Ethereum EVM chains) --- + +export function generateErc20Token(config: Erc20TokenConfig) { + const onChain = erc20Token( + config.id, + config.name, + config.fullName, + config.decimalPlaces, + config.contractAddress, + config.asset, + config.network, + config.features, + config.prefix, + config.suffix + ); + + if (config.skipOfc) return [onChain]; + + return [onChain, createOfcCoin(config, onChain.features, 'eth', false)]; +} + +export function generateTestErc20Token(config: Erc20TokenConfig) { + const onChain = erc20Token( + config.id, + config.name, + config.fullName, + config.decimalPlaces, + config.contractAddress, + config.asset, + config.network, + config.features, + config.prefix, + config.suffix + ); + + if (config.skipOfc) return [onChain]; + + return [onChain, createOfcCoin(config, onChain.features, 'teth', true)]; +} diff --git a/modules/statics/src/index.ts b/modules/statics/src/index.ts index 1289b8858a..58a31c97d4 100644 --- a/modules/statics/src/index.ts +++ b/modules/statics/src/index.ts @@ -37,3 +37,9 @@ export { } from './account'; export { CoinMap } from './map'; export { networkFeatureMapForTokens } from './networkFeatureMapForTokens'; +export { + generateErc20Coin, + generateTestErc20Coin, + generateErc20Token, + generateTestErc20Token, +} from './coins/generateERC20';