From 41deea31dbd9f1da65573126d62329e9368024bc Mon Sep 17 00:00:00 2001 From: Yashvanth B L Date: Thu, 5 Mar 2026 18:17:51 +0530 Subject: [PATCH] feat(statics): onboard unieth, hppeth, h, hoodeth Add Unichain, House Party Protocol, Humanity Protocol, and Robinhood Chain as EVM-optimized coins. Ticket: CGARD-454 --- modules/bitgo/test/v2/unit/keychains.ts | 4 + modules/sdk-core/src/bitgo/environments.ts | 24 +++ modules/statics/src/allCoinsAndTokens.ts | 182 ++++++++++++++++++ modules/statics/src/base.ts | 8 + modules/statics/src/coins/ofcCoins.ts | 50 +++++ modules/statics/src/map.ts | 8 +- modules/statics/src/networks.ts | 80 ++++++++ .../unit/fixtures/expectedColdFeatures.ts | 8 + 8 files changed, 363 insertions(+), 1 deletion(-) diff --git a/modules/bitgo/test/v2/unit/keychains.ts b/modules/bitgo/test/v2/unit/keychains.ts index 10ec7cb77e..3c7a297948 100644 --- a/modules/bitgo/test/v2/unit/keychains.ts +++ b/modules/bitgo/test/v2/unit/keychains.ts @@ -102,8 +102,12 @@ describe('V2 Keychains', function () { n.asset !== UnderlyingAsset.FLRP && n.asset !== UnderlyingAsset.FLUENTETH && n.asset !== UnderlyingAsset.MANTLE && + n.asset !== UnderlyingAsset.H && + n.asset !== UnderlyingAsset.HOODETH && + n.asset !== UnderlyingAsset.HPPETH && n.asset !== UnderlyingAsset.JOVAYETH && n.asset !== UnderlyingAsset.OKBXLAYER && + n.asset !== UnderlyingAsset.UNIETH && n.asset !== UnderlyingAsset.MORPH && n.asset !== UnderlyingAsset.MORPHETH && n.asset !== UnderlyingAsset.DOGEOS && diff --git a/modules/sdk-core/src/bitgo/environments.ts b/modules/sdk-core/src/bitgo/environments.ts index 8ba16f5615..a18bcc6ebc 100644 --- a/modules/sdk-core/src/bitgo/environments.ts +++ b/modules/sdk-core/src/bitgo/environments.ts @@ -334,6 +334,18 @@ const mainnetBase: EnvironmentTemplate = { zksyncera: { baseUrl: 'https://api.etherscan.io/v2', }, + unieth: { + baseUrl: 'https://unichain.blockscout.com/api', + }, + hoodeth: { + baseUrl: 'https://explorer.testnet.chain.robinhood.com/api', // TODO: update to mainnet explorer API when available + }, + hppeth: { + baseUrl: 'https://explorer.hpp.io/api', + }, + h: { + baseUrl: 'https://humanity-mainnet.explorer.alchemy.com/api', + }, }, icpNodeUrl: 'https://ic0.app', worldExplorerBaseUrl: 'https://worldscan.org/', @@ -528,6 +540,18 @@ const testnetBase: EnvironmentTemplate = { zksyncera: { baseUrl: 'https://api.etherscan.io/v2', }, + unieth: { + baseUrl: 'https://unichain-sepolia.blockscout.com/api', + }, + hoodeth: { + baseUrl: 'https://explorer.testnet.chain.robinhood.com/api', + }, + hppeth: { + baseUrl: 'https://sepolia-explorer.hpp.io/api', + }, + h: { + baseUrl: 'https://humanity-testnet.explorer.alchemy.com/api', + }, }, stxNodeUrl: 'https://api.testnet.hiro.so', vetNodeUrl: 'https://sync-testnet.vechain.org', diff --git a/modules/statics/src/allCoinsAndTokens.ts b/modules/statics/src/allCoinsAndTokens.ts index 286b5c7d18..5df216cc05 100644 --- a/modules/statics/src/allCoinsAndTokens.ts +++ b/modules/statics/src/allCoinsAndTokens.ts @@ -2598,6 +2598,188 @@ export const allCoinsAndTokens = [ '', 'TJovayETH' ), + account( + 'fb957436-c58c-4fa3-a1f0-324a104cfa72', + 'unieth', + 'Unichain', + Networks.main.unieth, + 18, + UnderlyingAsset.UNIETH, + BaseUnit.ETH, + [ + ...EVM_FEATURES, + CoinFeature.SHARED_EVM_SIGNING, + CoinFeature.SHARED_EVM_SDK, + CoinFeature.EVM_COMPATIBLE_IMS, + CoinFeature.EVM_COMPATIBLE_UI, + CoinFeature.EVM_COMPATIBLE_WP, + CoinFeature.EVM_NON_BITGO_RECOVERY, + CoinFeature.EVM_UNSIGNED_SWEEP_RECOVERY, + CoinFeature.SUPPORTS_ERC20, + ], + KeyCurve.Secp256k1, + '', + 'UniETH' + ), + account( + '9eb4b6e4-7dcf-4ce7-b1c2-2ae9fa894fb6', + 'tunieth', + 'Testnet Unichain', + Networks.test.unieth, + 18, + UnderlyingAsset.UNIETH, + BaseUnit.ETH, + [ + ...EVM_FEATURES, + CoinFeature.SHARED_EVM_SIGNING, + CoinFeature.SHARED_EVM_SDK, + CoinFeature.EVM_COMPATIBLE_IMS, + CoinFeature.EVM_COMPATIBLE_UI, + CoinFeature.EVM_COMPATIBLE_WP, + CoinFeature.EVM_NON_BITGO_RECOVERY, + CoinFeature.EVM_UNSIGNED_SWEEP_RECOVERY, + CoinFeature.SUPPORTS_ERC20, + ], + KeyCurve.Secp256k1, + '', + 'TUniETH' + ), + account( + 'd68be88e-9d17-404c-ba7f-08aba1844437', + 'hppeth', + 'House Party Protocol', + Networks.main.hppeth, + 18, + UnderlyingAsset.HPPETH, + BaseUnit.ETH, + [ + ...EVM_FEATURES, + CoinFeature.SHARED_EVM_SIGNING, + CoinFeature.SHARED_EVM_SDK, + CoinFeature.EVM_COMPATIBLE_IMS, + CoinFeature.EVM_COMPATIBLE_UI, + CoinFeature.EVM_COMPATIBLE_WP, + CoinFeature.EVM_NON_BITGO_RECOVERY, + CoinFeature.EVM_UNSIGNED_SWEEP_RECOVERY, + CoinFeature.SUPPORTS_ERC20, + ], + KeyCurve.Secp256k1, + '', + 'HppETH' + ), + account( + '2e4011ee-9512-4c51-896f-5b24ac477b52', + 'thppeth', + 'Testnet House Party Protocol', + Networks.test.hppeth, + 18, + UnderlyingAsset.HPPETH, + BaseUnit.ETH, + [ + ...EVM_FEATURES, + CoinFeature.SHARED_EVM_SIGNING, + CoinFeature.SHARED_EVM_SDK, + CoinFeature.EVM_COMPATIBLE_IMS, + CoinFeature.EVM_COMPATIBLE_UI, + CoinFeature.EVM_COMPATIBLE_WP, + CoinFeature.EVM_NON_BITGO_RECOVERY, + CoinFeature.EVM_UNSIGNED_SWEEP_RECOVERY, + CoinFeature.SUPPORTS_ERC20, + ], + KeyCurve.Secp256k1, + '', + 'THppETH' + ), + account( + 'f0e3aa10-8e76-483c-ad4d-35aefb74b77b', + 'thoodeth', + 'Testnet Robinhood Chain', + Networks.test.hoodeth, + 18, + UnderlyingAsset.HOODETH, + BaseUnit.ETH, + [ + ...EVM_FEATURES, + CoinFeature.SHARED_EVM_SIGNING, + CoinFeature.SHARED_EVM_SDK, + CoinFeature.EVM_COMPATIBLE_IMS, + CoinFeature.EVM_COMPATIBLE_UI, + CoinFeature.EVM_COMPATIBLE_WP, + CoinFeature.EVM_NON_BITGO_RECOVERY, + CoinFeature.EVM_UNSIGNED_SWEEP_RECOVERY, + ], + KeyCurve.Secp256k1, + '', + 'THoodETH' + ), + account( + '1b17bbf4-02fc-492d-9071-6d7f47395f7a', + 'hoodeth', + 'Robinhood Chain', + Networks.main.hoodeth, + 18, + UnderlyingAsset.HOODETH, + BaseUnit.ETH, + [ + ...EVM_FEATURES, + CoinFeature.SHARED_EVM_SIGNING, + CoinFeature.SHARED_EVM_SDK, + CoinFeature.EVM_COMPATIBLE_IMS, + CoinFeature.EVM_COMPATIBLE_UI, + CoinFeature.EVM_COMPATIBLE_WP, + CoinFeature.EVM_NON_BITGO_RECOVERY, + CoinFeature.EVM_UNSIGNED_SWEEP_RECOVERY, + ], + KeyCurve.Secp256k1, + '', + 'HoodETH' + ), + account( + 'ddf32007-d3a5-4cad-9a20-b7793e96fdd2', + 'h', + 'Humanity Protocol', + Networks.main.h, + 18, + UnderlyingAsset.H, + BaseUnit.ETH, + [ + ...EVM_FEATURES, + CoinFeature.SHARED_EVM_SIGNING, + CoinFeature.SHARED_EVM_SDK, + CoinFeature.EVM_COMPATIBLE_IMS, + CoinFeature.EVM_COMPATIBLE_UI, + CoinFeature.EVM_COMPATIBLE_WP, + CoinFeature.EVM_NON_BITGO_RECOVERY, + CoinFeature.EVM_UNSIGNED_SWEEP_RECOVERY, + CoinFeature.SUPPORTS_ERC20, + ], + KeyCurve.Secp256k1, + '', + 'H' + ), + account( + 'e23f84e3-9b6a-4b0a-8a1e-6dc8e57650a8', + 'th', + 'Testnet Humanity Protocol', + Networks.test.h, + 18, + UnderlyingAsset.H, + BaseUnit.ETH, + [ + ...EVM_FEATURES, + CoinFeature.SHARED_EVM_SIGNING, + CoinFeature.SHARED_EVM_SDK, + CoinFeature.EVM_COMPATIBLE_IMS, + CoinFeature.EVM_COMPATIBLE_UI, + CoinFeature.EVM_COMPATIBLE_WP, + CoinFeature.EVM_NON_BITGO_RECOVERY, + CoinFeature.EVM_UNSIGNED_SWEEP_RECOVERY, + CoinFeature.SUPPORTS_ERC20, + ], + KeyCurve.Secp256k1, + '', + 'TH' + ), // Jovayeth mainnet tokens erc20Token( diff --git a/modules/statics/src/base.ts b/modules/statics/src/base.ts index ef1cdf66e5..2f68be0dd5 100644 --- a/modules/statics/src/base.ts +++ b/modules/statics/src/base.ts @@ -63,10 +63,13 @@ export enum CoinFamily { FANTOM = 'fantom', // Fantom FLR = 'flr', FLRP = 'flrp', + H = 'h', // Humanity Protocol HASH = 'hash', // Provenance HBAR = 'hbar', HBAREVM = 'hbarevm', // Hedera EVM coin HEMIETH = 'hemieth', // Hemi Ethereum L2 + HOODETH = 'hoodeth', // Robinhood Chain + HPPETH = 'hppeth', // House Party Protocol ICP = 'icp', INITIA = 'initia', INJECTIVE = 'injective', @@ -135,6 +138,7 @@ export enum CoinFamily { MORPHETH = 'morpheth', ARCUSDC = 'arcusdc', // ARC network TEMPO = 'tempo', // Tempo Network + UNIETH = 'unieth', // Unichain } /** @@ -596,10 +600,13 @@ export enum UnderlyingAsset { FLUENTETH = 'fluenteth', FANTOM = 'fantom', // Fantom GTC = 'gtc', + H = 'h', // Humanity Protocol HASH = 'hash', // Provenance HBAR = 'hbar', // Hedera main coin HBAREVM = 'hbarevm', // Hedera EVM coin HEMIETH = 'hemieth', // Hemi Ethereum L2 + HOODETH = 'hoodeth', // Robinhood Chain + HPPETH = 'hppeth', // House Party Protocol ICP = 'icp', IP = 'ip', // Story Chain INITIA = 'initia', @@ -661,6 +668,7 @@ export enum UnderlyingAsset { ZKETH = 'zketh', ZKSYNCERA = 'zksyncera', // ZkSync Era + UNIETH = 'unieth', // Unichain // ERC 20 tokens '$Evmosia.com' = '$evmosia.com', '0xREVIEW' = '0xreview', diff --git a/modules/statics/src/coins/ofcCoins.ts b/modules/statics/src/coins/ofcCoins.ts index 8654be87ef..2e8323f33c 100644 --- a/modules/statics/src/coins/ofcCoins.ts +++ b/modules/statics/src/coins/ofcCoins.ts @@ -4099,4 +4099,54 @@ export const ofcCoins = [ 6, UnderlyingAsset['ttempo:thetausd'] ), + ofc('6f0246cf-b792-483a-b720-9755b158c614', 'ofcunieth', 'Unichain', 18, UnderlyingAsset.UNIETH, CoinKind.CRYPTO), + tofc( + '4efb1377-8439-410a-b460-2aeeff944fb2', + 'ofctunieth', + 'Testnet Unichain', + 18, + UnderlyingAsset.UNIETH, + CoinKind.CRYPTO + ), + ofc( + '598218e6-8b8b-45a1-9f50-f114e1c43f0d', + 'ofchppeth', + 'House Party Protocol', + 18, + UnderlyingAsset.HPPETH, + CoinKind.CRYPTO + ), + tofc( + '4baee871-3e95-4a46-98cd-4854cffaea7c', + 'ofcthppeth', + 'Testnet House Party Protocol', + 18, + UnderlyingAsset.HPPETH, + CoinKind.CRYPTO + ), + ofc('b0360f56-3aaa-4171-a5d6-c0c6ba56a392', 'ofch', 'Humanity Protocol', 18, UnderlyingAsset.H, CoinKind.CRYPTO), + tofc( + '74d684f5-b5fd-4bcd-88cc-96f27ee133a1', + 'ofcth', + 'Testnet Humanity Protocol', + 18, + UnderlyingAsset.H, + CoinKind.CRYPTO + ), + ofc( + 'ce1af7ad-a694-4180-9a44-2bd9aa5b031e', + 'ofchoodeth', + 'Robinhood Chain', + 18, + UnderlyingAsset.HOODETH, + CoinKind.CRYPTO + ), + tofc( + '85c5c0d5-a1b0-48b7-9c40-b1ab7162053e', + 'ofcthoodeth', + 'Testnet Robinhood Chain', + 18, + UnderlyingAsset.HOODETH, + CoinKind.CRYPTO + ), ]; diff --git a/modules/statics/src/map.ts b/modules/statics/src/map.ts index 1dd315b96d..d39e83904d 100644 --- a/modules/statics/src/map.ts +++ b/modules/statics/src/map.ts @@ -116,7 +116,13 @@ export class CoinMap { 43114: 'avax', 43113: 'tavax', 100: 'gno', - 130: 'uni', + 130: 'unieth', + 1301: 'tunieth', + 190415: 'hppeth', + 181228: 'thppeth', + 6985385: 'h', + 7080969: 'th', + 46630: 'thoodeth', 324: 'zketh', 8453: 'baseeth', 84532: 'tbaseeth', diff --git a/modules/statics/src/networks.ts b/modules/statics/src/networks.ts index 7d34495ca0..8e66ae62fc 100644 --- a/modules/statics/src/networks.ts +++ b/modules/statics/src/networks.ts @@ -1756,6 +1756,78 @@ class JovayETHTestnet extends Testnet implements EthereumNetwork { nativeCoinOperationHashPrefix = '2019775'; } +class Unieth extends Mainnet implements EthereumNetwork { + name = 'Unichain'; + family = CoinFamily.UNIETH; + explorerUrl = 'https://uniscan.xyz/tx/'; + accountExplorerUrl = 'https://uniscan.xyz/address/'; + chainId = 130; + nativeCoinOperationHashPrefix = '130'; +} + +class UniethTestnet extends Testnet implements EthereumNetwork { + name = 'Testnet Unichain'; + family = CoinFamily.UNIETH; + explorerUrl = 'https://sepolia.uniscan.xyz/tx/'; + accountExplorerUrl = 'https://sepolia.uniscan.xyz/address/'; + chainId = 1301; + nativeCoinOperationHashPrefix = '1301'; +} + +class Hppeth extends Mainnet implements EthereumNetwork { + name = 'House Party Protocol'; + family = CoinFamily.HPPETH; + explorerUrl = 'https://explorer.hpp.io/tx/'; + accountExplorerUrl = 'https://explorer.hpp.io/address/'; + chainId = 190415; + nativeCoinOperationHashPrefix = '190415'; +} + +class HppethTestnet extends Testnet implements EthereumNetwork { + name = 'Testnet House Party Protocol'; + family = CoinFamily.HPPETH; + explorerUrl = 'https://sepolia-explorer.hpp.io/tx/'; + accountExplorerUrl = 'https://sepolia-explorer.hpp.io/address/'; + chainId = 181228; + nativeCoinOperationHashPrefix = '181228'; +} + +class HoodethTestnet extends Testnet implements EthereumNetwork { + name = 'Testnet Robinhood Chain'; + family = CoinFamily.HOODETH; + explorerUrl = 'https://explorer.testnet.chain.robinhood.com/tx/'; + accountExplorerUrl = 'https://explorer.testnet.chain.robinhood.com/address/'; + chainId = 46630; + nativeCoinOperationHashPrefix = '46630'; +} + +class Hoodeth extends Mainnet implements EthereumNetwork { + name = 'Robinhood Chain'; + family = CoinFamily.HOODETH; + explorerUrl = 'https://explorer.testnet.chain.robinhood.com/tx/'; // TODO: update to mainnet explorer when available + accountExplorerUrl = 'https://explorer.testnet.chain.robinhood.com/address/'; // TODO: update to mainnet explorer when available + chainId = 46630; // TODO: update to mainnet chain id when available + nativeCoinOperationHashPrefix = '46630'; // TODO: update to mainnet chain id when available +} + +class HumanityProtocol extends Mainnet implements EthereumNetwork { + name = 'Humanity Protocol'; + family = CoinFamily.H; + explorerUrl = 'https://explorer.humanity.org/mainnet/txns/'; + accountExplorerUrl = 'https://explorer.humanity.org/mainnet/accounts/'; + chainId = 6985385; + nativeCoinOperationHashPrefix = '6985385'; +} + +class HumanityProtocolTestnet extends Testnet implements EthereumNetwork { + name = 'Testnet Humanity Protocol'; + family = CoinFamily.H; + explorerUrl = 'https://explorer.humanity.org/testnet/txns/'; + accountExplorerUrl = 'https://explorer.humanity.org/testnet/accounts/'; + chainId = 7080969; + nativeCoinOperationHashPrefix = '7080969'; +} + class Xlayer extends Mainnet implements EthereumNetwork { name = 'X Layer'; family = CoinFamily.OKBXLAYER; @@ -2513,10 +2585,13 @@ export const Networks = { flr: Object.freeze(new Flare()), flrP: Object.freeze(new FlareP()), fluenteth: Object.freeze(new FluentETH()), + h: Object.freeze(new HumanityProtocol()), hash: Object.freeze(new Hash()), + hoodeth: Object.freeze(new Hoodeth()), hedera: Object.freeze(new Hedera()), hederaEVM: Object.freeze(new HederaEVM()), hemieth: Object.freeze(new HemiEth()), + hppeth: Object.freeze(new Hppeth()), icp: Object.freeze(new Icp()), ip: Object.freeze(new IP()), initia: Object.freeze(new Initia()), @@ -2583,6 +2658,7 @@ export const Networks = { zeta: Object.freeze(new Zeta()), zkSync: Object.freeze(new ZkSync()), zkSyncEra: Object.freeze(new ZkSyncEra()), + unieth: Object.freeze(new Unieth()), }, test: { ada: Object.freeze(new AdaTestnet()), @@ -2627,6 +2703,7 @@ export const Networks = { flr: Object.freeze(new FlareTestnet()), flrP: Object.freeze(new FlarePTestnet()), fluenteth: Object.freeze(new FluentETHTestnet()), + h: Object.freeze(new HumanityProtocolTestnet()), mon: Object.freeze(new MonadTestnet()), megaeth: Object.freeze(new MegaETHTestnet()), pyrmont: Object.freeze(new Pyrmont()), @@ -2634,6 +2711,8 @@ export const Networks = { ethereumClassicTestnet: Object.freeze(new EthereumClassicTestnet()), hash: Object.freeze(new HashTestnet()), hedera: Object.freeze(new HederaTestnet()), + hoodeth: Object.freeze(new HoodethTestnet()), + hppeth: Object.freeze(new HppethTestnet()), hederaEVM: Object.freeze(new HederaEVMTestnet()), hemieth: Object.freeze(new HemiEthTestnet()), icp: Object.freeze(new IcpTestnet()), @@ -2704,5 +2783,6 @@ export const Networks = { zeta: Object.freeze(new ZetaTestnet()), zkSync: Object.freeze(new ZkSyncTestnet()), zkSyncEra: Object.freeze(new ZkSyncEraTestnet()), + unieth: Object.freeze(new UniethTestnet()), }, }; diff --git a/modules/statics/test/unit/fixtures/expectedColdFeatures.ts b/modules/statics/test/unit/fixtures/expectedColdFeatures.ts index 079e8c82ec..6626148633 100644 --- a/modules/statics/test/unit/fixtures/expectedColdFeatures.ts +++ b/modules/statics/test/unit/fixtures/expectedColdFeatures.ts @@ -93,9 +93,12 @@ export const expectedColdFeatures = { 'fetchai', 'flow', 'fluenteth', + 'h', 'hash', 'hbarevm', 'hemieth', + 'hoodeth', + 'hppeth', 'icp', 'ip', // Story chain 'initia', @@ -126,6 +129,7 @@ export const expectedColdFeatures = { 'sonic', 'somi', 'sui', + 'unieth', 'usdt0', 'tao', 'tempo', @@ -164,8 +168,11 @@ export const expectedColdFeatures = { 'tfetchai', 'tflow', 'tfluenteth', + 'th', 'thbarevm', 'themieth', + 'thoodeth', + 'thppeth', 'tjovayeth', 'tog', 'tokbxlayer', @@ -218,6 +225,7 @@ export const expectedColdFeatures = { 'tseievm', 'tton', 'tsonic', + 'tunieth', 'tusdt0', ], neither: [