diff --git a/src/adapters/squid/constants.ts b/src/adapters/squid/constants.ts index 891162fe..13233109 100644 --- a/src/adapters/squid/constants.ts +++ b/src/adapters/squid/constants.ts @@ -1,20 +1,28 @@ -export const squidRouterAddress = "0xce16F69375520ab01377ce7B88f5BA8C48F8D666"; +export const squidRouterAddresses = { + default: "0xce16F69375520ab01377ce7B88f5BA8C48F8D666", + blast: "0x492751eC3c57141deb205eC2da8bFcb410738630", + fraxtal: "0xDC3D8e1Abe590BCa428a8a2FC4CfDbD1AcF57Bd9", +}; export const axelarGatewayAddresses = { - ethereum: "0x4F4495243837681061C4743b74B3eEdf548D56A5", - bsc: "0x304acf330bbE08d1e512eefaa92F6a57871fD895", - polygon: "0x6f015F16De9fC8791b234eF68D486d2bF203FBA8", - avax: "0x5029C0EFf6C34351a0CEc334542cDb22c7928f78", - fantom: "0x304acf330bbE08d1e512eefaa92F6a57871fD895", - arbitrum: "0xe432150cce91c13a887f7D836923d5597adD8E31", - base: "0xe432150cce91c13a887f7d836923d5597add8e31", - linea: "0xe432150cce91c13a887f7d836923d5597add8e31", - celo: "0xe432150cce91c13a887f7d836923d5597add8e31", - moonbeam: "0x4F4495243837681061C4743b74B3eEdf548D56A5", - kava: "0xe432150cce91c13a887f7D836923d5597adD8E31", - filecoin: "0xe432150cce91c13a887f7D836923d5597adD8E31", - optimism: "0xe432150cce91c13a887f7D836923d5597adD8E31", - mantle: "0xe432150cce91c13a887f7D836923d5597adD8E31", - } as { - [chain: string]: string; - }; + ethereum: "0x4F4495243837681061C4743b74B3eEdf548D56A5", + bsc: "0x304acf330bbE08d1e512eefaa92F6a57871fD895", + polygon: "0x6f015F16De9fC8791b234eF68D486d2bF203FBA8", + avax: "0x5029C0EFf6C34351a0CEc334542cDb22c7928f78", + fantom: "0x304acf330bbE08d1e512eefaa92F6a57871fD895", + arbitrum: "0xe432150cce91c13a887f7D836923d5597adD8E31", + base: "0xe432150cce91c13a887f7d836923d5597add8e31", + linea: "0xe432150cce91c13a887f7d836923d5597add8e31", + celo: "0xe432150cce91c13a887f7d836923d5597add8e31", + moonbeam: "0x4F4495243837681061C4743b74B3eEdf548D56A5", + kava: "0xe432150cce91c13a887f7D836923d5597adD8E31", + filecoin: "0xe432150cce91c13a887f7D836923d5597adD8E31", + optimism: "0xe432150cce91c13a887f7D836923d5597adD8E31", + mantle: "0xe432150cce91c13a887f7D836923d5597adD8E31", + scroll: "0xe432150cce91c13a887f7D836923d5597adD8E31", + blast: "0xe432150cce91c13a887f7D836923d5597adD8E31", + fraxtal: "0xe432150cce91c13a887f7D836923d5597adD8E31", + immutable: "0xe432150cce91c13a887f7D836923d5597adD8E31", +} as { + [chain: string]: string; +}; \ No newline at end of file diff --git a/src/adapters/squid/index.ts b/src/adapters/squid/index.ts index cb7c39f4..8fe781c9 100644 --- a/src/adapters/squid/index.ts +++ b/src/adapters/squid/index.ts @@ -1,16 +1,14 @@ import { Chain } from "@defillama/sdk/build/general"; import { BridgeAdapter, PartialContractEventParams } from "../../helpers/bridgeAdapter.type"; -import { constructTransferParams } from "../../helpers/eventParams"; import { getTxDataFromEVMEventLogs } from "../../helpers/processTransactions"; import { ethers } from "ethers"; import { fetchAssets, getTokenAddress} from "./utils"; -import { axelarGatewayAddresses, squidRouterAddress } from "./constants"; +import { axelarGatewayAddresses, squidRouterAddresses } from "./constants"; - - const constructGatewayWithdrawalParams = (assets: any[], chain: string) => { - let GatewayWithdrawalParams: PartialContractEventParams; +const constructGatewayWithdrawalParams = (assets: any[], chain: string) => { + const squidRouterAddress = squidRouterAddresses[chain as keyof typeof squidRouterAddresses] || squidRouterAddresses.default; - return GatewayWithdrawalParams = { + return { target: "", topic: "ContractCallWithToken(address,string,string,bytes32,bytes,string,uint256)", topics: [ethers.utils.id("ContractCallWithToken(address,string,string,bytes32,bytes,string,uint256)"), ethers.utils.hexZeroPad(squidRouterAddress,32)], @@ -18,7 +16,6 @@ import { axelarGatewayAddresses, squidRouterAddress } from "./constants"; logKeys: { blockNumber: "blockNumber", txHash: "transactionHash", - // token: "token" }, argKeys: { from: "payload", @@ -27,22 +24,19 @@ import { axelarGatewayAddresses, squidRouterAddress } from "./constants"; token: "symbol" }, argGetters: { - from: (log: any) => "0x".concat(log.payload.substr(90,40)), // note: this is not the real sender address + from: (log: any) => "0x".concat(log.payload.substr(90,40)), amount: (log: any) => log.amount, to: (log: any) => "0x".concat(log.payload.substr(log.payload.lastIndexOf(log.payload.substr(90,40)),40)), token: (log: any) => getTokenAddress(log.symbol, chain, assets) }, isDeposit: false, - }; +} - } - - - const constructGatewayDepositParams = (assets: any[], chain: string) => { - let GatewayDepositParams: PartialContractEventParams; - - return GatewayDepositParams = { +const constructGatewayDepositParams = (assets: any[], chain: string) => { + const squidRouterAddress = squidRouterAddresses[chain as keyof typeof squidRouterAddresses] || squidRouterAddresses.default; + + return { target: "", topic: "ContractCallApprovedWithMint(bytes32,string,string,address,bytes32,string,uint256,bytes32,uint256)", topics: [ethers.utils.id("ContractCallApprovedWithMint(bytes32,string,string,address,bytes32,string,uint256,bytes32,uint256)"), null, ethers.utils.hexZeroPad(squidRouterAddress,32)], @@ -50,7 +44,6 @@ import { axelarGatewayAddresses, squidRouterAddress } from "./constants"; logKeys: { blockNumber: "blockNumber", txHash: "transactionHash", - // token: "token" }, argKeys: { from: "sourceAddress", @@ -66,35 +59,30 @@ import { axelarGatewayAddresses, squidRouterAddress } from "./constants"; }, isDeposit: true, }; - } - +} const constructParams = (chain: string) => { - return async (fromBlock: number, toBlock: number) => { let eventParams = [] as PartialContractEventParams[]; - // fetch all assets from axelarscan const assets = await fetchAssets(); const GatewayDepositParams = constructGatewayDepositParams(assets, chain); - const deposit = {...GatewayDepositParams, target: axelarGatewayAddresses[chain], }; + const deposit = {...GatewayDepositParams, target: axelarGatewayAddresses[chain]}; const GatewayWithdrawalParams = constructGatewayWithdrawalParams(assets, chain); - const withdraw = {...GatewayWithdrawalParams, target: axelarGatewayAddresses[chain], }; - + const withdraw = {...GatewayWithdrawalParams, target: axelarGatewayAddresses[chain]}; eventParams.push(deposit, withdraw); return getTxDataFromEVMEventLogs("squid", chain as Chain, fromBlock, toBlock, eventParams); } - }; const adapter: BridgeAdapter = { polygon: constructParams("polygon"), fantom: constructParams("fantom"), avalanche: constructParams("avax"), - // bsc: constructParams("bsc"), + bsc: constructParams("bsc"), ethereum: constructParams("ethereum"), arbitrum: constructParams("arbitrum"), base: constructParams("base"), @@ -105,6 +93,11 @@ const adapter: BridgeAdapter = { filecoin: constructParams("filecoin"), optimism: constructParams("optimism"), mantle: constructParams("mantle"), +//new chains + scroll: constructParams("scroll"), + blast: constructParams("blast"), + fraxtal: constructParams("fraxtal"), + immutable: constructParams("immutable"), }; -export default adapter; +export default adapter; \ No newline at end of file diff --git a/src/adapters/squid/utils.ts b/src/adapters/squid/utils.ts index 4c464a3c..9c86f5df 100644 --- a/src/adapters/squid/utils.ts +++ b/src/adapters/squid/utils.ts @@ -2,49 +2,46 @@ import fetch from "node-fetch"; const retry = require("async-retry"); export const getTokenAddress = (symbol: string, chain: string, assets: any[]) => { - symbol = getSymbol(symbol); chain = getChain(chain); - // find the correct token address given the chain let tokenAddress = assets.find((asset) => asset.symbol === symbol)?.addresses?.[chain]?.address; - // if the token address is not listed, then it means that the token is not that important. - // We return some hardcoded address for this token to circumvent the token address not found in defillama bridge server. if (tokenAddress == undefined) tokenAddress = "0x000000000000000000000000000000000000dEaD" return tokenAddress; } const getChain = (chain: string) => { - if (chain === "avax") return "avalanche"; - if (chain === "bsc") return "binance"; - else return chain; + switch (chain) { + case "avax": return "avalanche"; + case "bsc": return "binance"; + // Add any new chain mappings here if needed + default: return chain; + } } const getSymbol = (rawSymbol: string) => { - // the symbol is usually of the form axlUSDC, axlDAI, axlUSDT, etc. or if AXL is being transferred then AXL. let symbol: string = rawSymbol; - // for tokens of the form axl-TOKEN, remove the first 4 chars. if (symbol.startsWith("axl-")) symbol = symbol.slice(4); - // for tokens of the form axlUSDC, remove the first 3 chars. if (symbol.startsWith("axl")) symbol = symbol.slice(3); - // if the symbol is of a native token then prepend w, i.e., AVAX -> WAVAX. This is because axelar represents native tokens as wrapped version. - if (symbol === "AVAX") symbol = "WAVAX"; - if (symbol === "FTM") symbol = "WFTM"; - if (symbol === "BNB") symbol = "WBNB"; - if (symbol === "MATIC") symbol = "WMATIC"; - if (symbol === "FIL") symbol = "WFIL"; - if (symbol === "ETH") symbol = "WETH"; - if (symbol === "wAXL") symbol = "AXL"; - // make all uppercase if the token starts with an uppercase letter, e.g., Lqdr. - if (symbol.charAt(0) === symbol.toUpperCase().charAt(0)) symbol = symbol.toUpperCase(); + const nativeTokenMap: {[key: string]: string} = { + "AVAX": "WAVAX", + "FTM": "WFTM", + "BNB": "WBNB", + "MATIC": "WMATIC", + "FIL": "WFIL", + "ETH": "WETH", + "wAXL": "AXL", + // Add any new native token mappings here if needed + }; - return symbol; + symbol = nativeTokenMap[symbol] || symbol; + + return symbol.charAt(0) === symbol.toUpperCase().charAt(0) ? symbol.toUpperCase() : symbol; } export const fetchAssets = () => { - // fetch from axelarscan and pass {"method": "getAssets"} as json body return retry(() => fetch("https://api.axelarscan.io/", { method: "POST", @@ -56,4 +53,4 @@ export const fetchAssets = () => { }), }).then((res) => res.json()) ); - } \ No newline at end of file +} \ No newline at end of file diff --git a/src/data/bridgeNetworkData.ts b/src/data/bridgeNetworkData.ts index ea3b1136..04fb45e3 100644 --- a/src/data/bridgeNetworkData.ts +++ b/src/data/bridgeNetworkData.ts @@ -759,7 +759,7 @@ export default [ "Ethereum", "Polygon", "Avalanche", - // "BSC", + "BSC", "Fantom", "Arbitrum", "Base", @@ -769,9 +769,13 @@ export default [ "Kava", "Optimism", "Mantle", + "Scroll", + "Blast", + "Fraxtal", ], chainMapping: { - avalanche: "avax", // this is needed temporarily, need to fix and remove + avalanche: "avax", + // Add any other necessary mappings here }, }, {