diff --git a/modules/sdk-core/src/bitgo/environments.ts b/modules/sdk-core/src/bitgo/environments.ts index 21507c099c..b561c85cc4 100644 --- a/modules/sdk-core/src/bitgo/environments.ts +++ b/modules/sdk-core/src/bitgo/environments.ts @@ -78,6 +78,7 @@ interface EnvironmentTemplate { sgbExplorerApiToken?: string; icpNodeUrl: string; kaspaNodeUrl: string; + starknetNodeUrl: string; hyperLiquidNodeUrl: string; wemixExplorerBaseUrl?: string; wemixExplorerApiToken?: string; @@ -369,6 +370,7 @@ const mainnetBase: EnvironmentTemplate = { }, icpNodeUrl: 'https://ic0.app', kaspaNodeUrl: 'https://api.kaspa.org', + starknetNodeUrl: 'https://starknet-mainnet-rpc.publicnode.com/', hyperLiquidNodeUrl: 'https://api.hyperliquid.xyz', worldExplorerBaseUrl: 'https://worldscan.org/', somniaExplorerBaseUrl: 'https://mainnet.somnia.w3us.site/', @@ -448,6 +450,7 @@ const testnetBase: EnvironmentTemplate = { sgbExplorerBaseUrl: 'https://coston-explorer.flare.network', icpNodeUrl: 'https://ic0.app', kaspaNodeUrl: 'https://api-tn10.kaspa.org', + starknetNodeUrl: 'https://starknet-sepolia-rpc.publicnode.com/', hyperLiquidNodeUrl: 'https://api.hyperliquid-testnet.xyz', monExplorerBaseUrl: 'https://api.etherscan.io/v2', worldExplorerBaseUrl: 'https://sepolia.worldscan.org/', diff --git a/modules/statics/src/allCoinsAndTokens.ts b/modules/statics/src/allCoinsAndTokens.ts index 82f988b8ed..e94c628fb5 100644 --- a/modules/statics/src/allCoinsAndTokens.ts +++ b/modules/statics/src/allCoinsAndTokens.ts @@ -121,6 +121,7 @@ import { SGB_FEATURES, SOL_FEATURES, SONEIUM_FEATURES, + STARKNET_FEATURES, STX_FEATURES, SUI_FEATURES, SUI_TOKEN_FEATURES, @@ -2263,6 +2264,28 @@ export const allCoinsAndTokens = [ ICP_FEATURES, KeyCurve.Secp256k1 ), + account( + '56e92a2e-523c-4d48-8375-bff7e35eec11', + 'starknet', + 'Starknet', + Networks.main.starknet, + 18, + UnderlyingAsset.STARKNET, + BaseUnit.STARKNET, + STARKNET_FEATURES, + KeyCurve.Secp256k1 + ), + account( + '2a359f78-0cfa-4c15-8026-be508b05a37b', + 'tstarknet', + 'Testnet Starknet', + Networks.test.starknet, + 18, + UnderlyingAsset.STARKNET, + BaseUnit.STARKNET, + STARKNET_FEATURES, + KeyCurve.Secp256k1 + ), account( 'd348f38d-bff6-4936-842a-c9721e5027c1', 'polyx', diff --git a/modules/statics/src/base.ts b/modules/statics/src/base.ts index 810bf57c63..2b78737acc 100644 --- a/modules/statics/src/base.ts +++ b/modules/statics/src/base.ts @@ -115,6 +115,7 @@ export enum CoinFamily { SOL = 'sol', SONIC = 'sonic', SONEIUM = 'soneium', + STARKNET = 'starknet', STT = 'stt', SUI = 'sui', STX = 'stx', @@ -688,6 +689,7 @@ export enum UnderlyingAsset { SOMI = 'somi', // Somnia Chain SONEIUM = 'soneium', SONIC = 'sonic', + STARKNET = 'starknet', STT = 'stt', STX = 'stx', SUI = 'sui', @@ -3979,6 +3981,7 @@ export enum BaseUnit { TASI = 'atestfet', CANTON = 'canton', KASPA = 'sompi', + STARKNET = 'fri', USDC = 'usdc', } diff --git a/modules/statics/src/coinFeatures.ts b/modules/statics/src/coinFeatures.ts index 9a018a14e1..1a97ed34a3 100644 --- a/modules/statics/src/coinFeatures.ts +++ b/modules/statics/src/coinFeatures.ts @@ -645,6 +645,15 @@ export const ICP_FEATURES = [ CoinFeature.REBUILD_ON_CUSTODY_SIGNING, ]; +export const STARKNET_FEATURES = [ + ...ACCOUNT_COIN_DEFAULT_FEATURES, + CoinFeature.TSS, + CoinFeature.TSS_COLD, + CoinFeature.MPCV2, + CoinFeature.SHA256_WITH_ECDSA_TSS, + CoinFeature.REBUILD_ON_CUSTODY_SIGNING, +]; + export const TAO_FEATURES = [ ...ACCOUNT_COIN_DEFAULT_FEATURES, CoinFeature.TSS, diff --git a/modules/statics/src/networks.ts b/modules/statics/src/networks.ts index 3d0f1ae216..57b0e7139f 100644 --- a/modules/statics/src/networks.ts +++ b/modules/statics/src/networks.ts @@ -942,6 +942,20 @@ class SolTestnet extends Testnet implements AccountNetwork { explorerUrl = 'https://explorer.solana.com/tx/?cluster=devnet'; } +class StarknetMainnet extends Mainnet implements AccountNetwork { + name = 'Starknet'; + family = CoinFamily.STARKNET; + explorerUrl = 'https://voyager.online/tx/'; + accountExplorerUrl = 'https://voyager.online/contract/'; +} + +class StarknetTestnet extends Testnet implements AccountNetwork { + name = 'Testnet Starknet'; + family = CoinFamily.STARKNET; + explorerUrl = 'https://sepolia.voyager.online/tx/'; + accountExplorerUrl = 'https://sepolia.voyager.online/contract/'; +} + class Sui extends Mainnet implements AccountNetwork { name = 'Sui'; family = CoinFamily.SUI; @@ -2854,6 +2868,7 @@ export const Networks = { sgb: Object.freeze(new Songbird()), sol: Object.freeze(new Sol()), sonic: Object.freeze(new Sonic()), + starknet: Object.freeze(new StarknetMainnet()), sui: Object.freeze(new Sui()), near: Object.freeze(new Near()), stx: Object.freeze(new Stx()), @@ -2982,6 +2997,7 @@ export const Networks = { sei: Object.freeze(new SeiTestnet()), seievm: Object.freeze(new SeiEvmTestnet()), sol: Object.freeze(new SolTestnet()), + starknet: Object.freeze(new StarknetTestnet()), sui: Object.freeze(new SuiTestnet()), near: Object.freeze(new NearTestnet()), stx: Object.freeze(new StxTestnet()), diff --git a/modules/statics/test/unit/fixtures/expectedColdFeatures.ts b/modules/statics/test/unit/fixtures/expectedColdFeatures.ts index 7ad97b77c2..6e8f68965e 100644 --- a/modules/statics/test/unit/fixtures/expectedColdFeatures.ts +++ b/modules/statics/test/unit/fixtures/expectedColdFeatures.ts @@ -136,6 +136,7 @@ export const expectedColdFeatures = { 'sol', 'sonic', 'somi', + 'starknet', 'sui', 'unieth', 'usdt0', @@ -220,6 +221,7 @@ export const expectedColdFeatures = { 'tsei', 'tsgb', 'tsol', + 'tstarknet', 'tstt', 'tsui', 'ttao',