From 00e9adf29e79d1c4fb684064f3b2343cf3c11521 Mon Sep 17 00:00:00 2001 From: ajalalniya Date: Tue, 10 Sep 2024 16:06:47 +0200 Subject: [PATCH 1/4] add a new adapter --- src/adapters/crowdswap/index.ts | 48 +++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/adapters/crowdswap/index.ts diff --git a/src/adapters/crowdswap/index.ts b/src/adapters/crowdswap/index.ts new file mode 100644 index 0000000..8175346 --- /dev/null +++ b/src/adapters/crowdswap/index.ts @@ -0,0 +1,48 @@ +import { Chain } from "@defillama/sdk/build/general"; +import { BridgeAdapter, PartialContractEventParams } from "../../helpers/bridgeAdapter.type"; +import { constructTransferParams } from "../../helpers/eventParams"; +import { getTxDataFromEVMEventLogs } from "../../helpers/processTransactions"; + +const gatewayAddresses = { + ethereum: "0x22715dfF101D33B2a14a4834f7C527902Bc42899", + bsc: "0x587AaA2150AD416bAD6b9919FDfF2D78BE11383B", + polygon: "0x9092fCF5Ea1E22f2922eEa132D2931CDd795ab53", + optimism: "0x1B3aE33ff0241999854C05B0CdF821DE55A4404A", + arbitrum: "0x99a68649E927774680e9D3387BF8cCbF93B45230", +} as { + [chain: string]: string; +}; + +const nullAddress = "0x0000000000000000000000000000000000000000"; + +const constructParams = (chain: string) => { + let eventParams = [] as PartialContractEventParams[]; + const addy = gatewayAddresses[chain]; + + const deposit = constructTransferParams(addy, true, { + excludeFrom: [addy, nullAddress], + excludeTo: [nullAddress], + includeTo: [addy], + }); + + const withdraw = constructTransferParams(addy, false, { + excludeFrom: [nullAddress], + excludeTo: [nullAddress, addy], + includeFrom: [addy], + }); + + eventParams.push(deposit, withdraw); + + return async (fromBlock: number, toBlock: number) => + await getTxDataFromEVMEventLogs("crowdswap", chain as Chain, fromBlock, toBlock, eventParams); +}; + +const adapter: BridgeAdapter = { + polygon: constructParams("polygon"), + bsc: constructParams("bsc"), + ethereum: constructParams("ethereum"), + arbitrum: constructParams("arbitrum"), + optimism: constructParams("optimism"), +}; + +export default adapter; From ac17c4c04733a48626307dac1e037d8a2f1c0287 Mon Sep 17 00:00:00 2001 From: ajalalniya Date: Tue, 10 Sep 2024 16:19:36 +0200 Subject: [PATCH 2/4] add crowdswap to index.ts --- src/adapters/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/adapters/index.ts b/src/adapters/index.ts index d036d02..5c967eb 100644 --- a/src/adapters/index.ts +++ b/src/adapters/index.ts @@ -66,6 +66,7 @@ import bunnyfi from "./bunnyfi"; import minibridge from "./minibridge"; import cometbridge from "./cometbridge"; import fastbtc from "./rootstock-fastbtc-bridge" +import crowdswap from "./crowdswap" export default { polygon, @@ -134,7 +135,8 @@ export default { bunnyfi, minibridge, cometbridge, - fastbtc + fastbtc, + crowdswap, } as { [bridge: string]: BridgeAdapter; }; From 1fcfeb96394f6b383154f2ab09a2069d2bd70dc7 Mon Sep 17 00:00:00 2001 From: ajalalniya Date: Tue, 10 Sep 2024 16:40:30 +0200 Subject: [PATCH 3/4] add bridgeNetworkData and recordedBlocks --- src/data/bridgeNetworkData.ts | 15 +++++++++++++++ src/utils/recordedBlocks.json | 7 ++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/data/bridgeNetworkData.ts b/src/data/bridgeNetworkData.ts index dfd2f52..114def6 100644 --- a/src/data/bridgeNetworkData.ts +++ b/src/data/bridgeNetworkData.ts @@ -1470,4 +1470,19 @@ export default [ }, destinationChain: "Bitcoin", }, + { + id: 71, + displayName: "Crowdswap", + bridgeDbName: "crowdswap", + iconLink: "icons:crowdswap", + largeTxThreshold: 10000, + url: "https://scanner.crowdswap.org/", + chains: [ + "Ethereum", + "Arbitrum", + "Optimism", + "BSC", + "Polygon" + ] + }, ] as BridgeNetwork[]; diff --git a/src/utils/recordedBlocks.json b/src/utils/recordedBlocks.json index 71b48d8..233618f 100644 --- a/src/utils/recordedBlocks.json +++ b/src/utils/recordedBlocks.json @@ -72,5 +72,10 @@ "chainport:aurora": { "startBlock": 73145592, "endBlock": 77620017 }, "rootstock:rsk": { "startBlock": 3616337, "endBlock": 3616337 }, "tokenbrige:rsk": { "startBlock": 4089976, "endBlock": 6088951 }, - "fastbtc:rsk": { "startBlock": 4089976, "endBlock": 6088951 } + "fastbtc:rsk": { "startBlock": 4089976, "endBlock": 6088951 }, + "crowdswap:ethereum": { "startBlock": 20407899, "endBlock": 20720738 }, + "crowdswap:polygon": { "startBlock": 56713222, "endBlock": 61657366 }, + "crowdswap:bsc": { "startBlock": 40878700, "endBlock": 42133978 }, + "crowdswap:arbitrum": { "startBlock": 237073033, "endBlock": 252086093 }, + "crowdswap:optimism": { "startBlock": 123302167, "endBlock": 125190128 } } From 7f0e737c2de088b58b59e2fec8599e280fd71a83 Mon Sep 17 00:00:00 2001 From: ajalalniya Date: Wed, 11 Sep 2024 12:46:38 +0200 Subject: [PATCH 4/4] Fix getLog params --- src/adapters/crowdswap/index.ts | 72 +++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 16 deletions(-) diff --git a/src/adapters/crowdswap/index.ts b/src/adapters/crowdswap/index.ts index 8175346..49831cc 100644 --- a/src/adapters/crowdswap/index.ts +++ b/src/adapters/crowdswap/index.ts @@ -1,8 +1,8 @@ import { Chain } from "@defillama/sdk/build/general"; import { BridgeAdapter, PartialContractEventParams } from "../../helpers/bridgeAdapter.type"; -import { constructTransferParams } from "../../helpers/eventParams"; import { getTxDataFromEVMEventLogs } from "../../helpers/processTransactions"; + const gatewayAddresses = { ethereum: "0x22715dfF101D33B2a14a4834f7C527902Bc42899", bsc: "0x587AaA2150AD416bAD6b9919FDfF2D78BE11383B", @@ -13,26 +13,66 @@ const gatewayAddresses = { [chain: string]: string; }; -const nullAddress = "0x0000000000000000000000000000000000000000"; -const constructParams = (chain: string) => { - let eventParams = [] as PartialContractEventParams[]; - const addy = gatewayAddresses[chain]; +let routerAddresses = {} as { + [chain: string]: string[]; +}; - const deposit = constructTransferParams(addy, true, { - excludeFrom: [addy, nullAddress], - excludeTo: [nullAddress], - includeTo: [addy], - }); +const activeChains = ["ethereum", "bsc", "polygon", "optimism", "arbitrum"]; - const withdraw = constructTransferParams(addy, false, { - excludeFrom: [nullAddress], - excludeTo: [nullAddress, addy], - includeFrom: [addy], - }); +for(const chain of activeChains){ + if(!routerAddresses[chain]){ + routerAddresses[chain] = ["0x549D287218E5fc9D07A91Fe2e1337D5c21B808B2","0x30462a4863a3db9233006a87320a8e07c4a71a36"] + } +} + + +const constructParams = (chain: string) => { + let eventParams = [] as PartialContractEventParams[]; + const routers = routerAddresses[chain]; - eventParams.push(deposit, withdraw); + for (const router of Object.values(routers)) { + const deposit :PartialContractEventParams = { + target: router, + topic: "MessageSent(bytes32,uint256,uint256,uint256,address,address,uint64)", + abi: ["event MessageSent(bytes32 indexed messageId, uint256 sourceAmount, uint256 destinationAmount, uint256 destinationMinAmount, address sourceTokenAddress, address destinationTokenAddress, uint64 indexed destinationChainId)"], + isDeposit: true, + logKeys: { + blockNumber: "blockNumber", + txHash: "transactionHash", + }, + argKeys: { + amount: "sourceAmount", + token: "sourceTokenAddress" + }, + fixedEventData: { + to: gatewayAddresses[chain], + from: router, + }, + }; + + const withdraw :PartialContractEventParams = { + target: router, + topic: "Sold(bytes32,address,uint256,uint256,address,uint256,uint256,address,uint256,uint256)", + abi: ["event Sold(bytes32 indexed messageId, address sourceTokenAddress, uint256 sourceAmount, uint256 usdValue, address crowdAddress, uint256 crowdAmount, uint256 crowdPrice, address tokenXAddress, uint256 tokenXAmount, uint256 tokenXPrice)"], + isDeposit: false, // event type + logKeys: { + blockNumber: "blockNumber", + txHash: "transactionHash", + }, + argKeys: { + amount: "tokenXAmount", + token: "tokenXAddress", + + }, + fixedEventData: { + from: router, + to: gatewayAddresses[chain], + }, + }; + eventParams.push(deposit, withdraw); + } return async (fromBlock: number, toBlock: number) => await getTxDataFromEVMEventLogs("crowdswap", chain as Chain, fromBlock, toBlock, eventParams); };