From ab0a07299b02a8df238a5487bf8b6e9f0c1105cc Mon Sep 17 00:00:00 2001 From: Slava Date: Mon, 20 Oct 2025 17:46:12 +0300 Subject: [PATCH 1/3] chore: remap chains --- sdk/package-lock.json | 67 ++++++++++++++------------------- sdk/package.json | 4 +- sdk/src/gateway/utils/common.ts | 28 +++++++++----- 3 files changed, 48 insertions(+), 51 deletions(-) diff --git a/sdk/package-lock.json b/sdk/package-lock.json index 7878ed332..c6f10496e 100644 --- a/sdk/package-lock.json +++ b/sdk/package-lock.json @@ -1,12 +1,12 @@ { "name": "@gobob/bob-sdk", - "version": "4.3.8", + "version": "4.3.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gobob/bob-sdk", - "version": "4.3.8", + "version": "4.3.9", "dependencies": { "@bitcoinerlab/secp256k1": "^1.2.0", "@eslint/eslintrc": "^3.3.1", @@ -18,7 +18,7 @@ "bitcoin-address-validation": "^3.0.0", "bitcoinjs-lib": "^6.1.7", "global": "^4.4.0", - "viem": "^2.33.2" + "viem": "^2.38.3" }, "devDependencies": { "@scure/bip32": "^2.0.0", @@ -1052,7 +1052,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", - "license": "MIT", "engines": { "node": "^14.21.3 || >=16" }, @@ -2107,16 +2106,15 @@ } }, "node_modules/abitype": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", - "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", - "license": "MIT", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.1.0.tgz", + "integrity": "sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==", "funding": { "url": "https://github.com/sponsors/wevm" }, "peerDependencies": { "typescript": ">=5.0.4", - "zod": "^3 >=3.22.0" + "zod": "^3.22.0 || ^4.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -3382,8 +3380,7 @@ "node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "node_modules/expect-type": { "version": "1.2.1", @@ -4667,24 +4664,23 @@ "license": "MIT" }, "node_modules/ox": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.9.1.tgz", - "integrity": "sha512-NVI0cajROntJWtFnxZQ1aXDVy+c6DLEXJ3wwON48CgbPhmMJrpRTfVbuppR+47RmXm3lZ/uMaKiFSkLdAO1now==", + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.9.6.tgz", + "integrity": "sha512-8SuCbHPvv2eZLYXrNmC0EC12rdzXQLdhnOMlHDW2wiCPLxBrOOJwX5L5E61by+UjTPOryqQiRSnjIKCI+GykKg==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/wevm" } ], - "license": "MIT", "dependencies": { "@adraffy/ens-normalize": "^1.11.0", "@noble/ciphers": "^1.3.0", - "@noble/curves": "^1.9.1", + "@noble/curves": "1.9.1", "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", - "abitype": "^1.0.8", + "abitype": "^1.0.9", "eventemitter3": "5.0.1" }, "peerDependencies": { @@ -4697,16 +4693,14 @@ } }, "node_modules/ox/node_modules/@adraffy/ens-normalize": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz", - "integrity": "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==", - "license": "MIT" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", + "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==" }, "node_modules/ox/node_modules/@noble/curves": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", - "license": "MIT", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", + "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", "dependencies": { "@noble/hashes": "1.8.0" }, @@ -4721,7 +4715,6 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "license": "MIT", "engines": { "node": "^14.21.3 || >=16" }, @@ -4733,7 +4726,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", - "license": "MIT", "dependencies": { "@noble/curves": "~1.9.0", "@noble/hashes": "~1.8.0", @@ -4747,7 +4739,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", - "license": "MIT", "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" @@ -5883,24 +5874,23 @@ } }, "node_modules/viem": { - "version": "2.36.0", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.36.0.tgz", - "integrity": "sha512-Xz7AkGtR43K+NY74X2lBevwfRrsXuifGUzt8QiULO47NXIcT7g3jcA4nIvl5m2OTE5v8SlzishwXmg64xOIVmQ==", + "version": "2.38.3", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.38.3.tgz", + "integrity": "sha512-By2TutLv07iNHHtWqHHzjGipevYsfGqT7KQbGEmqLco1qTJxKnvBbSviqiu6/v/9REV6Q/FpmIxf2Z7/l5AbcQ==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/wevm" } ], - "license": "MIT", "dependencies": { - "@noble/curves": "1.9.6", + "@noble/curves": "1.9.1", "@noble/hashes": "1.8.0", "@scure/bip32": "1.7.0", "@scure/bip39": "1.6.0", - "abitype": "1.0.8", + "abitype": "1.1.0", "isows": "1.0.7", - "ox": "0.9.1", + "ox": "0.9.6", "ws": "8.18.3" }, "peerDependencies": { @@ -5913,10 +5903,9 @@ } }, "node_modules/viem/node_modules/@noble/curves": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.6.tgz", - "integrity": "sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA==", - "license": "MIT", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", + "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", "dependencies": { "@noble/hashes": "1.8.0" }, diff --git a/sdk/package.json b/sdk/package.json index 224c2c1ae..13746ba10 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@gobob/bob-sdk", - "version": "4.3.8", + "version": "4.3.9", "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { @@ -51,6 +51,6 @@ "bitcoin-address-validation": "^3.0.0", "bitcoinjs-lib": "^6.1.7", "global": "^4.4.0", - "viem": "^2.33.2" + "viem": "^2.38.3" } } diff --git a/sdk/src/gateway/utils/common.ts b/sdk/src/gateway/utils/common.ts index 8d34367d9..c46d7ec9a 100644 --- a/sdk/src/gateway/utils/common.ts +++ b/sdk/src/gateway/utils/common.ts @@ -2,6 +2,7 @@ import * as bitcoin from 'bitcoinjs-lib'; import { Address, createPublicClient, + defineChain, encodeAbiParameters, formatUnits, Hex, @@ -138,21 +139,28 @@ export function formatBtc(btc: bigint) { return formatUnits(btc, 8); } -const supportedChains = [ +const supportedChainsMapping = { bob, - mainnet, + ethereum: defineChain({ + ...mainnet, + rpcUrls: { + default: { + http: ['https://ethereum-rpc.publicnode.com'], + }, + }, + }), sonic, bsc, unichain, - berachain, + bera: berachain, sei, avalanche, base, soneium, optimism, -] as const; +} as const; -const chainIdToChainConfigMapping = supportedChains.reduce( +const chainIdToChainConfigMapping = Object.values(supportedChainsMapping).reduce( (acc, chain) => { acc[chain.id] = chain; return acc; @@ -160,9 +168,9 @@ const chainIdToChainConfigMapping = supportedChains.reduce( {} as Record ); -const chainNameToChainIdMapping = supportedChains.reduce( - (acc, chain) => { - acc[chain.name.toLowerCase()] = chain.id; +const chainNameToChainIdMapping = Object.entries(supportedChainsMapping).reduce( + (acc, [name, chain]) => { + acc[name.toLowerCase()] = chain.id; return acc; }, {} as Record @@ -172,7 +180,7 @@ function getChainIdByName(chainName: string) { const chainId = chainNameToChainIdMapping[chainName.toLowerCase()]; if (!chainId) { throw new Error( - `Chain id for "${chainName}" not found. Allowed values ${supportedChains.map((chain) => chain.name)}` + `Chain id for "${chainName}" not found. Allowed values ${Object.keys(supportedChainsMapping).map((chainName) => chainName.toLocaleLowerCase())}` ); } return chainId; @@ -182,7 +190,7 @@ function getChainConfigById(chainId: number) { const config = chainIdToChainConfigMapping[chainId]; if (!config) { throw new Error( - `Chain id for "${chainId}" not found. Allowed values ${supportedChains.map((chain) => chain.id)}` + `Chain id for "${chainId}" not found. Allowed values ${Object.values(supportedChainsMapping).map((chain) => chain.id)}` ); } From c63a411d99aad294dd8d94047fcb1f7134e4307a Mon Sep 17 00:00:00 2001 From: Slava Date: Mon, 20 Oct 2025 19:36:04 +0300 Subject: [PATCH 2/3] chore: remap chains --- sdk/package-lock.json | 4 +- sdk/package.json | 2 +- sdk/src/gateway/tokens.ts | 170 +++++++++++++++++++++++++++----- sdk/src/gateway/utils/common.ts | 9 +- 4 files changed, 157 insertions(+), 28 deletions(-) diff --git a/sdk/package-lock.json b/sdk/package-lock.json index c6f10496e..b05842d58 100644 --- a/sdk/package-lock.json +++ b/sdk/package-lock.json @@ -1,12 +1,12 @@ { "name": "@gobob/bob-sdk", - "version": "4.3.9", + "version": "4.3.10", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gobob/bob-sdk", - "version": "4.3.9", + "version": "4.3.10", "dependencies": { "@bitcoinerlab/secp256k1": "^1.2.0", "@eslint/eslintrc": "^3.3.1", diff --git a/sdk/package.json b/sdk/package.json index 13746ba10..6914929d1 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@gobob/bob-sdk", - "version": "4.3.9", + "version": "4.3.10", "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { diff --git a/sdk/src/gateway/tokens.ts b/sdk/src/gateway/tokens.ts index 7f0835ee2..4b06cd0db 100644 --- a/sdk/src/gateway/tokens.ts +++ b/sdk/src/gateway/tokens.ts @@ -1,6 +1,52 @@ import { Token } from './types'; import { Address, isAddress } from 'viem'; -import { bob, bobSepolia, mainnet, optimism } from 'viem/chains'; +import { avalanche, base, berachain, bob, bobSepolia, bsc, mainnet, soneium, sonic, unichain } from 'viem/chains'; + +const layerZeroTokens = [ + { + name: 'Wrapped BTC (OFT)', + symbol: 'WBTC (OFT)', + decimals: 8, + tokens: { + bob: { + address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', + }, + ethereum: { + address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', + }, + berachain: { + address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', + }, + optimism: { + address: '0xc3f854b2970f8727d28527ece33176fac67fef48', + }, + sonic: { + address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', + }, + soneium: { + address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', + }, + bsc: { + address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', + }, + unichain: { + address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', + }, + sei: { + address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', + }, + avalanche: { + address: '0x0555e30da8f98308edb960aa94c0db47230d2b9c', + }, + base: { + address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', + }, + }, + logoURI: 'https://raw.githubusercontent.com/bob-collective/bob/master/assets/wbtc.svg', + allowanceSlot: 6n, + balanceSlot: 5n, + }, +]; // TODO: re-write to use superchain tokenlist const bobTokens = [ @@ -34,6 +80,36 @@ const bobTokens = [ bob: { address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', }, + ethereum: { + address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', + }, + berachain: { + address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', + }, + optimism: { + address: '0xc3f854b2970f8727d28527ece33176fac67fef48', + }, + sonic: { + address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', + }, + soneium: { + address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', + }, + bsc: { + address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', + }, + unichain: { + address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', + }, + sei: { + address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', + }, + avalanche: { + address: '0x0555e30da8f98308edb960aa94c0db47230d2b9c', + }, + base: { + address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', + }, }, logoURI: 'https://raw.githubusercontent.com/bob-collective/bob/master/assets/wbtc.svg', allowanceSlot: 6n, @@ -375,6 +451,30 @@ const TOKENS: Array<{ ethereum?: { address: string; }; + berachain?: { + address: string; + }; + sonic?: { + address: string; + }; + soneium?: { + address: string; + }; + bsc?: { + address: string; + }; + unichain?: { + address: string; + }; + sei?: { + address: string; + }; + avalanche?: { + address: string; + }; + base?: { + address: string; + }; }; logoURI: string; allowanceSlot?: bigint; // optional @@ -389,21 +489,47 @@ const TOKENS: Array<{ ...avalonTokens, ...ionicTokens, ...vedaTokens, + ...layerZeroTokens, ]; +const supportedChainNames = [ + 'bob', + 'bob-sepolia', + // 'optimism', + 'ethereum', + 'berachain', + 'sonic', + 'soneium', + 'bsc', + 'unichain', + // 'sei', + 'avalanche', + 'base', +] as const; + +const chainNameToIdMapping: Record<(typeof supportedChainNames)[number], number> = { + bob: bob.id, + 'bob-sepolia': bobSepolia.id, + // optimism: optimism.id, + ethereum: mainnet.id, + berachain: berachain.id, + sonic: sonic.id, + soneium: soneium.id, + bsc: bsc.id, + unichain: unichain.id, + // sei: sei.id, + avalanche: avalanche.id, + base: base.id, +}; + /** @description Tokens supported on BOB and BOB Sepolia */ export const SYMBOL_LOOKUP: { [key in number]: { [key in string]: Token } } = {}; export const ADDRESS_LOOKUP: { [key in number]: { [key in string]: Token } } = {}; -SYMBOL_LOOKUP[bob.id] = {}; -SYMBOL_LOOKUP[bobSepolia.id] = {}; -SYMBOL_LOOKUP[optimism.id] = {}; -SYMBOL_LOOKUP[mainnet.id] = {}; - -ADDRESS_LOOKUP[bob.id] = {}; -ADDRESS_LOOKUP[bobSepolia.id] = {}; -ADDRESS_LOOKUP[optimism.id] = {}; -ADDRESS_LOOKUP[mainnet.id] = {}; +for (const chainName of supportedChainNames) { + SYMBOL_LOOKUP[chainNameToIdMapping[chainName]] = {}; + ADDRESS_LOOKUP[chainNameToIdMapping[chainName]] = {}; +} function addToken(address: string, token: (typeof TOKENS)[number], chainId: number) { const lowerAddress = address.toLowerCase(); @@ -421,20 +547,11 @@ function addToken(address: string, token: (typeof TOKENS)[number], chainId: numb } for (const token of TOKENS) { - if (token.tokens.bob) { - addToken(token.tokens.bob.address, token, bob.id); - } - - if (token.tokens['bob-sepolia']) { - addToken(token.tokens['bob-sepolia'].address, token, bobSepolia.id); - } - - if (token.tokens.optimism) { - addToken(token.tokens.optimism.address, token, optimism.id); - } - - if (token.tokens.ethereum) { - addToken(token.tokens.ethereum.address, token, mainnet.id); + for (const chainName of supportedChainNames) { + const chainToken = token.tokens[chainName]; + if (chainToken) { + addToken(chainToken.address, token, chainNameToIdMapping[chainName]); + } } } @@ -472,6 +589,11 @@ export function getTokenSlots( ): { allowanceSlot: bigint; balanceSlot: bigint } { const lowerAddress = tokenAddress.toLowerCase(); + /** + * @dev bera -> berachain. `bera` is defined in layerzero deployments json + */ + if (originChain === 'bera') originChain = 'berachain'; + // Look up the token in the master TOKENS array const token = TOKENS.find((t) => { const chainToken = t.tokens[originChain]; diff --git a/sdk/src/gateway/utils/common.ts b/sdk/src/gateway/utils/common.ts index c46d7ec9a..358c5386b 100644 --- a/sdk/src/gateway/utils/common.ts +++ b/sdk/src/gateway/utils/common.ts @@ -157,7 +157,14 @@ const supportedChainsMapping = { avalanche, base, soneium, - optimism, + optimism: defineChain({ + ...optimism, + rpcUrls: { + default: { + http: ['https://optimism-rpc.publicnode.com'], + }, + }, + }), } as const; const chainIdToChainConfigMapping = Object.values(supportedChainsMapping).reduce( From 2026403ba02a22b220427f928ce177347630ef10 Mon Sep 17 00:00:00 2001 From: Slava Date: Tue, 21 Oct 2025 16:08:41 +0300 Subject: [PATCH 3/3] chore: reset changes, add get token slots method --- sdk/package.json | 5 +- sdk/src/gateway/layerzero.ts | 16 ++- sdk/src/gateway/tokens.ts | 170 +++++--------------------------- sdk/src/gateway/utils/common.ts | 20 +++- 4 files changed, 57 insertions(+), 154 deletions(-) diff --git a/sdk/package.json b/sdk/package.json index 6914929d1..3b3c7e387 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@gobob/bob-sdk", - "version": "4.3.10", + "version": "4.3.9", "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { @@ -52,5 +52,6 @@ "bitcoinjs-lib": "^6.1.7", "global": "^4.4.0", "viem": "^2.38.3" - } + }, + "packageManager": "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39" } diff --git a/sdk/src/gateway/layerzero.ts b/sdk/src/gateway/layerzero.ts index bf3c13c14..2f33713be 100644 --- a/sdk/src/gateway/layerzero.ts +++ b/sdk/src/gateway/layerzero.ts @@ -18,7 +18,7 @@ import { import { bob, bobSepolia, mainnet } from 'viem/chains'; import { layerZeroOftAbi, quoterV2Abi } from './abi'; import { AllWalletClientParams, GatewayApiClient } from './client'; -import { getTokenAddress, getTokenSlots } from './tokens'; +import { getTokenAddress } from './tokens'; import { CrossChainOrder, ExecuteQuoteParams, @@ -605,7 +605,7 @@ export class LayerZeroGatewayClient extends GatewayApiClient { if (chain.id === mainnet.id) { // WBTC mainnet - const wbtcMainnetSlots = getTokenSlots(wbtcMainnetAddress, 'ethereum'); + const wbtcMainnetSlots = this.getTokenSlots('ethereum'); const allowanceSlot = computeAllowanceSlot( user as Address, wbtcOftAddress as Address, @@ -628,7 +628,7 @@ export class LayerZeroGatewayClient extends GatewayApiClient { }); } else { // WBTC OFT - const wbtcOftSlots = getTokenSlots(wbtcOftAddress as Address, fromChain); + const wbtcOftSlots = this.getTokenSlots(fromChain); const oftBalanceSlot = computeBalanceSlot(user as Address, wbtcOftSlots.balanceSlot); @@ -716,6 +716,16 @@ export class LayerZeroGatewayClient extends GatewayApiClient { }); } + private getTokenSlots(originChain: string) { + // slots for WBTC ERC20 token on ethereum + if (originChain === 'ethereum') return { allowanceSlot: 2n, balanceSlot: 0n }; + + return { + allowanceSlot: 6n, + balanceSlot: 5n, + }; + } + /** * Retrieves all orders (onramp, offramp, and crosschain swaps) for a specific user address. * diff --git a/sdk/src/gateway/tokens.ts b/sdk/src/gateway/tokens.ts index 4b06cd0db..7f0835ee2 100644 --- a/sdk/src/gateway/tokens.ts +++ b/sdk/src/gateway/tokens.ts @@ -1,52 +1,6 @@ import { Token } from './types'; import { Address, isAddress } from 'viem'; -import { avalanche, base, berachain, bob, bobSepolia, bsc, mainnet, soneium, sonic, unichain } from 'viem/chains'; - -const layerZeroTokens = [ - { - name: 'Wrapped BTC (OFT)', - symbol: 'WBTC (OFT)', - decimals: 8, - tokens: { - bob: { - address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', - }, - ethereum: { - address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', - }, - berachain: { - address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', - }, - optimism: { - address: '0xc3f854b2970f8727d28527ece33176fac67fef48', - }, - sonic: { - address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', - }, - soneium: { - address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', - }, - bsc: { - address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', - }, - unichain: { - address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', - }, - sei: { - address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', - }, - avalanche: { - address: '0x0555e30da8f98308edb960aa94c0db47230d2b9c', - }, - base: { - address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', - }, - }, - logoURI: 'https://raw.githubusercontent.com/bob-collective/bob/master/assets/wbtc.svg', - allowanceSlot: 6n, - balanceSlot: 5n, - }, -]; +import { bob, bobSepolia, mainnet, optimism } from 'viem/chains'; // TODO: re-write to use superchain tokenlist const bobTokens = [ @@ -80,36 +34,6 @@ const bobTokens = [ bob: { address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', }, - ethereum: { - address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', - }, - berachain: { - address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', - }, - optimism: { - address: '0xc3f854b2970f8727d28527ece33176fac67fef48', - }, - sonic: { - address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', - }, - soneium: { - address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', - }, - bsc: { - address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', - }, - unichain: { - address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', - }, - sei: { - address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', - }, - avalanche: { - address: '0x0555e30da8f98308edb960aa94c0db47230d2b9c', - }, - base: { - address: '0x0555E30da8f98308EdB960aa94C0Db47230d2B9c', - }, }, logoURI: 'https://raw.githubusercontent.com/bob-collective/bob/master/assets/wbtc.svg', allowanceSlot: 6n, @@ -451,30 +375,6 @@ const TOKENS: Array<{ ethereum?: { address: string; }; - berachain?: { - address: string; - }; - sonic?: { - address: string; - }; - soneium?: { - address: string; - }; - bsc?: { - address: string; - }; - unichain?: { - address: string; - }; - sei?: { - address: string; - }; - avalanche?: { - address: string; - }; - base?: { - address: string; - }; }; logoURI: string; allowanceSlot?: bigint; // optional @@ -489,47 +389,21 @@ const TOKENS: Array<{ ...avalonTokens, ...ionicTokens, ...vedaTokens, - ...layerZeroTokens, ]; -const supportedChainNames = [ - 'bob', - 'bob-sepolia', - // 'optimism', - 'ethereum', - 'berachain', - 'sonic', - 'soneium', - 'bsc', - 'unichain', - // 'sei', - 'avalanche', - 'base', -] as const; - -const chainNameToIdMapping: Record<(typeof supportedChainNames)[number], number> = { - bob: bob.id, - 'bob-sepolia': bobSepolia.id, - // optimism: optimism.id, - ethereum: mainnet.id, - berachain: berachain.id, - sonic: sonic.id, - soneium: soneium.id, - bsc: bsc.id, - unichain: unichain.id, - // sei: sei.id, - avalanche: avalanche.id, - base: base.id, -}; - /** @description Tokens supported on BOB and BOB Sepolia */ export const SYMBOL_LOOKUP: { [key in number]: { [key in string]: Token } } = {}; export const ADDRESS_LOOKUP: { [key in number]: { [key in string]: Token } } = {}; -for (const chainName of supportedChainNames) { - SYMBOL_LOOKUP[chainNameToIdMapping[chainName]] = {}; - ADDRESS_LOOKUP[chainNameToIdMapping[chainName]] = {}; -} +SYMBOL_LOOKUP[bob.id] = {}; +SYMBOL_LOOKUP[bobSepolia.id] = {}; +SYMBOL_LOOKUP[optimism.id] = {}; +SYMBOL_LOOKUP[mainnet.id] = {}; + +ADDRESS_LOOKUP[bob.id] = {}; +ADDRESS_LOOKUP[bobSepolia.id] = {}; +ADDRESS_LOOKUP[optimism.id] = {}; +ADDRESS_LOOKUP[mainnet.id] = {}; function addToken(address: string, token: (typeof TOKENS)[number], chainId: number) { const lowerAddress = address.toLowerCase(); @@ -547,11 +421,20 @@ function addToken(address: string, token: (typeof TOKENS)[number], chainId: numb } for (const token of TOKENS) { - for (const chainName of supportedChainNames) { - const chainToken = token.tokens[chainName]; - if (chainToken) { - addToken(chainToken.address, token, chainNameToIdMapping[chainName]); - } + if (token.tokens.bob) { + addToken(token.tokens.bob.address, token, bob.id); + } + + if (token.tokens['bob-sepolia']) { + addToken(token.tokens['bob-sepolia'].address, token, bobSepolia.id); + } + + if (token.tokens.optimism) { + addToken(token.tokens.optimism.address, token, optimism.id); + } + + if (token.tokens.ethereum) { + addToken(token.tokens.ethereum.address, token, mainnet.id); } } @@ -589,11 +472,6 @@ export function getTokenSlots( ): { allowanceSlot: bigint; balanceSlot: bigint } { const lowerAddress = tokenAddress.toLowerCase(); - /** - * @dev bera -> berachain. `bera` is defined in layerzero deployments json - */ - if (originChain === 'bera') originChain = 'berachain'; - // Look up the token in the master TOKENS array const token = TOKENS.find((t) => { const chainToken = t.tokens[originChain]; diff --git a/sdk/src/gateway/utils/common.ts b/sdk/src/gateway/utils/common.ts index 358c5386b..723eb221e 100644 --- a/sdk/src/gateway/utils/common.ts +++ b/sdk/src/gateway/utils/common.ts @@ -149,11 +149,25 @@ const supportedChainsMapping = { }, }, }), - sonic, + sonic: defineChain({ + ...sonic, + rpcUrls: { + default: { + http: ['https://sonic.drpc.org'], + }, + }, + }), bsc, unichain, bera: berachain, - sei, + sei: defineChain({ + ...sei, + rpcUrls: { + default: { + http: ['https://sei.drpc.org'], + }, + }, + }), avalanche, base, soneium, @@ -161,7 +175,7 @@ const supportedChainsMapping = { ...optimism, rpcUrls: { default: { - http: ['https://optimism-rpc.publicnode.com'], + http: ['https://optimism.drpc.org'], }, }, }),