diff --git a/src/adapters/index.ts b/src/adapters/index.ts index e721073a..81b9361d 100644 --- a/src/adapters/index.ts +++ b/src/adapters/index.ts @@ -91,6 +91,7 @@ import intersoon from "./intersoon"; import usdt0 from "./usdt0"; import pheasantNetwork from "./pheasant-network"; import teleswap from "./teleswap"; +import snowbridge from "./snowbridge"; export default { polygon, @@ -185,6 +186,7 @@ export default { usdt0, pheasantNetwork, teleswap, + snowbridge, } as { [bridge: string]: BridgeAdapter | AsyncBridgeAdapter; }; diff --git a/src/adapters/snowbridge/index.ts b/src/adapters/snowbridge/index.ts new file mode 100644 index 00000000..f0d3ad38 --- /dev/null +++ b/src/adapters/snowbridge/index.ts @@ -0,0 +1,104 @@ +import { BridgeAdapter, PartialContractEventParams } from "../../helpers/bridgeAdapter.type"; +import { Chain } from "@defillama/sdk/build/general"; +import { getTxDataFromEVMEventLogs } from "../../helpers/processTransactions"; +import { constructTransferParams } from "../../helpers/eventParams"; +import { BigNumber } from "ethers"; + +const contractAddresses = { + ethereum: { + gateway: "0x27ca963c279c93801941e1eb8799c23f407d68e7", // Gateway address + agent: "0xd803472c47a87D7B63E888DE53f03B4191B846a8", // Agent address + tokens: [ + { + token: "0xba41ddf06b7ffd89d1267b5a93bfef2424eb2003", // MYTH + }, + { + token: "0x18084fba666a33d37592fa2633fd49a74dd93a88", // tBTC v2 + }, + ], + }, +} as { + [chain: string]: { + gateway: string; + agent: string; + tokens: { token: string }[]; + }; +}; + +const depositParams: PartialContractEventParams = { + target: "", + topic: "Transfer(address,address,uint256)", + abi: ["event Transfer(address indexed from, address indexed to, uint256 value)"], + logKeys: { + blockNumber: "blockNumber", + txHash: "transactionHash", + }, + argKeys: { + amount: "value", + from: "from", + to: "to", + }, + argGetters: { + amount: (log: any) => BigNumber.from(log.value), + }, + fixedEventData: { + token: "", + }, + isDeposit: true, +}; + +const withdrawalParams: PartialContractEventParams = { + target: "", + topic: "Transfer(address,address,uint256)", + abi: ["event Transfer(address indexed from, address indexed to, uint256 value)"], + logKeys: { + blockNumber: "blockNumber", + txHash: "transactionHash", + }, + argKeys: { + amount: "value", + from: "from", + to: "to", + }, + fixedEventData: { + token: "", + }, + isDeposit: false, +}; + +const constructParams = (chain: string) => { + let eventParams: PartialContractEventParams[] = []; + + const contractAddressesForChain = contractAddresses[chain]; + const gateway = contractAddressesForChain?.gateway; + const agent = contractAddressesForChain?.agent; + const tokens = contractAddressesForChain?.tokens || []; + + tokens.map(({ token }) => { + const tokenDepositParams: PartialContractEventParams = { + ...depositParams, + target: token, + filter: { includeTo: [agent] }, + fixedEventData: { ...depositParams.fixedEventData, token: token }, + }; + const tokenWithdrawalParams: PartialContractEventParams = { + ...withdrawalParams, + target: token, + isDeposit: false, + filter: { includeFrom: [agent] }, + fixedEventData: { ...withdrawalParams.fixedEventData, token: token }, + }; + eventParams.push(tokenDepositParams, tokenWithdrawalParams); + }); + + // Return a function to fetch transaction data from event logs + return async (fromBlock: number, toBlock: number) => + getTxDataFromEVMEventLogs("snowbridge", chain as Chain, fromBlock, toBlock, eventParams); +}; + +// Step 6: Export the adapter +const adapter: BridgeAdapter = Object.fromEntries( + Object.keys(contractAddresses).map((chain) => [chain, constructParams(chain)]) +); + +export default adapter; diff --git a/src/data/bridgeNetworkData.ts b/src/data/bridgeNetworkData.ts index 5875599c..cb607555 100644 --- a/src/data/bridgeNetworkData.ts +++ b/src/data/bridgeNetworkData.ts @@ -1235,14 +1235,27 @@ export default [ iconLink: "icons:butter-network", largeTxThreshold: 10000, url: "", - chains: ["Ethereum", "Polygon", "BSC", "Arbitrum", "Base", "Optimism", "Tron", - "X Layer", "MAP Relay Chain", "Kaia", "Linea", - "Scroll", "Mantle", "Merlin", "Blast"], + chains: [ + "Ethereum", + "Polygon", + "BSC", + "Arbitrum", + "Base", + "Optimism", + "Tron", + "X Layer", + "MAP Relay Chain", + "Kaia", + "Linea", + "Scroll", + "Mantle", + "Merlin", + "Blast", + ], chainMapping: { "map relay chain": "map", "x layer": "xlayer", kaia: "klaytn", - }, destinationChain: "MAP Relay Chain", }, @@ -2438,4 +2451,18 @@ export default [ "World Chain": "wc", }, }, + { + id: 96, + displayName: "Snowbridge", + bridgeDbName: "snowbridge", + iconLink: "icons:snowbridge", + slug: "snowbridge", + largeTxThreshold: 10000, + url: "https://snowbridge.xyz/", + chains: ["Polkadot", "Ethereum"], + destinationChain: "Ethereum", + chainMapping: { + snowbridge: "snowbridge", + }, + }, ] as BridgeNetwork[];