From 7c9e06cd06b5a35c5748b862f4c70c01d1c7c8b2 Mon Sep 17 00:00:00 2001 From: Prajwal U Date: Thu, 29 Oct 2026 14:06:26 +0530 Subject: [PATCH] feat(statics): onboard arc, xrp, and sepolia tokens for CSHLD-2081 ## Problem Client-requested tokens from CSHLD-2081 were not supported: ZAR Universal on ARC and on XRP, and the Teuroc testnet token on Sepolia had no statics definitions, so wallets, pricing, and UI could not recognize them. ## Goal Make ZAR Universal available on ARC and XRP as ungated tokens, add OFC equivalents for go accounts, and add the Teuroc Sepolia testnet token that cannot be onboarded via AMS TAT. ## Fix - Add erc20Token definition for arcusdc:zaru (18 decimals, address verified on-chain) on Networks.main.arcusdc. - Add xrpToken definition for xrp:zaru (issuer rwu15x3fKT6M8vADi6vrrR5nUXimkhagQf, currency code 5A415255 zero-padded to 40 hex digits, 15 decimals). - Add OFC equivalents ofcarcusdc:zaru and ofcxrp:zaru for go accounts, using the same generic ofcerc20/ofcXrpToken factories and shapes as the existing arcusdc and xrp OFC entries. - Add sepeth:teuroc (Sepolia testnet via terc20, 6 decimals, on-chain symbol EURC, named after the existing teuroc asset) plus its Sepolia naming-convention test exception, since Sepolia tokens use the sepeth: prefix, and its ofcsepeth:teuroc OFC equivalent via the same tofcerc20 shape as the other ofcsepeth tokens. ## Testing Statics tsc build passes; the full statics unit suite passes; the built package resolves all six new coins with the expected decimals, contracts, and networks, each added static id appears exactly once in the tree, and the pre-rename symbol no longer resolves; prettier check is clean on changed files. Ticket: CSHLD-2081 Co-Authored-By: Claude Sonnet 4.6 --- modules/statics/src/allCoinsAndTokens.ts | 20 +++++++++++++ modules/statics/src/base.ts | 3 ++ modules/statics/src/coins/erc20Coins.ts | 12 ++++++++ modules/statics/src/coins/ofcCoins.ts | 1 + modules/statics/src/coins/ofcErc20Coins.ts | 28 +++++++++++++++++++ .../test/unit/tokenNamingConvention.ts | 1 + 6 files changed, 65 insertions(+) diff --git a/modules/statics/src/allCoinsAndTokens.ts b/modules/statics/src/allCoinsAndTokens.ts index 3ef3a699d40..54c495c9f14 100644 --- a/modules/statics/src/allCoinsAndTokens.ts +++ b/modules/statics/src/allCoinsAndTokens.ts @@ -5374,6 +5374,15 @@ export const allCoinsAndTokens = [ UnderlyingAsset['arcusdc:usdau'], Networks.main.arcusdc ), + erc20Token( + '152f7e3f-53ac-4a59-b948-3bc1932c9443', + 'arcusdc:zaru', + 'ZAR Universal', + 18, + '0xe205b4e7ac03e3f7b2060c3edf2171aa7126c0d5', + UnderlyingAsset['arcusdc:zaru'], + Networks.main.arcusdc + ), // Scroll mainnet tokens erc20Token( @@ -8444,6 +8453,17 @@ export const allCoinsAndTokens = [ 'circle.com', UnderlyingAsset['xrp:usdc'] ), + xrpToken( + '232d2dee-399b-42b8-978c-aab3bb989b8f', + 'xrp:zaru', + 'ZAR Universal', + 15, + 'rwu15x3fKT6M8vADi6vrrR5nUXimkhagQf', + '5A41525500000000000000000000000000000000', + 'rwu15x3fKT6M8vADi6vrrR5nUXimkhagQf::5A41525500000000000000000000000000000000', + 'zaru.network', + UnderlyingAsset['xrp:zaru'] + ), xrpToken( '5067c3e5-51f2-4209-a842-d4450436245a', 'xrp:eurcv', diff --git a/modules/statics/src/base.ts b/modules/statics/src/base.ts index ee2d41cad26..a59cc5c5d12 100644 --- a/modules/statics/src/base.ts +++ b/modules/statics/src/base.ts @@ -2013,6 +2013,7 @@ export enum UnderlyingAsset { 'sepeth:wtgxx' = 'sepeth:wtgxx', 'sepeth:real1' = 'sepeth:real1', 'sepeth:jpyc' = 'sepeth:jpyc', + 'sepeth:teuroc' = 'sepeth:teuroc', // Robinhood Chain testnet ERC-20 tokens 'thoodeth:amzn' = 'thoodeth:amzn', 'thoodeth:tsla' = 'thoodeth:tsla', @@ -4357,6 +4358,7 @@ export enum UnderlyingAsset { 'xrp:eurcv' = 'xrp:eurcv', 'xrp:aau' = 'xrp:aau', 'xrp:fiuaxrp' = 'xrp:fiuaxrp', + 'xrp:zaru' = 'xrp:zaru', // XRP MPT mainnet tokens 'xrp:kld' = 'xrp:kld', 'xrp:key' = 'xrp:key', @@ -4772,6 +4774,7 @@ export enum UnderlyingAsset { 'arcusdc:eurc' = 'arcusdc:eurc', 'arcusdc:usyc' = 'arcusdc:usyc', 'arcusdc:usdau' = 'arcusdc:usdau', // CECHO-2426 + 'arcusdc:zaru' = 'arcusdc:zaru', // Scroll mainnet tokens 'scrolleth:scr' = 'scrolleth:scr', diff --git a/modules/statics/src/coins/erc20Coins.ts b/modules/statics/src/coins/erc20Coins.ts index 62c7fa318e9..65f1cbf5138 100644 --- a/modules/statics/src/coins/erc20Coins.ts +++ b/modules/statics/src/coins/erc20Coins.ts @@ -15243,6 +15243,18 @@ export const erc20Coins = [ undefined, Networks.test.sepolia ), + terc20( + '6597b778-8bd0-4679-9e8e-a2a1c6ac1d43', + 'sepeth:teuroc', + 'Sepolia Testnet Teuroc', + 6, + '0x08210f9170f89ab7658f0b5e3ff39b0e03c594d4', + UnderlyingAsset['sepeth:teuroc'], + ACCOUNT_COIN_DEFAULT_FEATURES, + undefined, + undefined, + Networks.test.sepolia + ), // ERC-7984 underlying plain ERC-20 tokens (Zama fhEVM - Hoodi) terc20( diff --git a/modules/statics/src/coins/ofcCoins.ts b/modules/statics/src/coins/ofcCoins.ts index 92b167f95e5..099fa31134a 100644 --- a/modules/statics/src/coins/ofcCoins.ts +++ b/modules/statics/src/coins/ofcCoins.ts @@ -2384,6 +2384,7 @@ export const ofcCoins = [ ofcXrpToken('1813238c-8cc5-4b79-9959-793c5c220b1d', 'ofcxrp:solo', 'Sologenic', 15, UnderlyingAsset['xrp:solo']), ofcXrpToken('4c875336-64dc-427b-bde7-eb25e2f20272', 'ofcxrp:aau', 'Archax', 15, UnderlyingAsset['xrp:aau']), ofcXrpToken('2744ab2a-f7e6-4606-aed1-11d7dffca18e', 'ofcxrp:fiuaxrp', 'FIUAXRP', 15, UnderlyingAsset['xrp:fiuaxrp']), + ofcXrpToken('ab1f352f-4967-4c4f-bbf4-2f5e16a2e0c1', 'ofcxrp:zaru', 'ZAR Universal', 15, UnderlyingAsset['xrp:zaru']), tofcXrpToken('0c22d8ef-4c27-4088-bd3d-eb76484d5edf', 'ofctxrp:xsgd', 'XSGB', 15, UnderlyingAsset['txrp:xsgd']), ofcArbethErc20( 'df2296e6-366e-4707-bab0-bf16ce592601', diff --git a/modules/statics/src/coins/ofcErc20Coins.ts b/modules/statics/src/coins/ofcErc20Coins.ts index 2dcf4d1e3e8..fac0ffcdf11 100644 --- a/modules/statics/src/coins/ofcErc20Coins.ts +++ b/modules/statics/src/coins/ofcErc20Coins.ts @@ -4620,6 +4620,20 @@ export const ofcErc20Coins = [ true, 'arcusdc' ), + ofcerc20( + '9d454df4-e90d-4690-b223-0554a4cc2e02', + 'ofcarcusdc:zaru', + 'ZAR Universal', + 18, + UnderlyingAsset['arcusdc:zaru'], + undefined, + undefined, + '', + undefined, + undefined, + true, + 'arcusdc' + ), // Scroll mainnet OFC tokens ofcerc20( @@ -5206,6 +5220,20 @@ export const tOfcErc20Coins = [ undefined, 'sepeth' ), + tofcerc20( + 'f4c7d0a9-8e21-4b63-9c55-2d1e6f7a3b84', + 'ofcsepeth:teuroc', + 'Sepolia Testnet Teuroc', + 6, + UnderlyingAsset['sepeth:teuroc'], + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + 'sepeth' + ), ofcerc20( 'cc2a92cf-d799-463b-b08c-e9a4d5e87934', diff --git a/modules/statics/test/unit/tokenNamingConvention.ts b/modules/statics/test/unit/tokenNamingConvention.ts index f4da8f457c5..b9467c404ed 100644 --- a/modules/statics/test/unit/tokenNamingConvention.ts +++ b/modules/statics/test/unit/tokenNamingConvention.ts @@ -86,6 +86,7 @@ describe('Token Naming Convention Tests', function () { 'sepeth:wtgxx', 'sepeth:real1', 'sepeth:jpyc', + 'sepeth:teuroc', 'fixed', 'schz', 'bgerch',