From 254b9333aec0be4723a9e276b0b0959502b3d572 Mon Sep 17 00:00:00 2001 From: 0x0Koda <12773720+0x0Koda@users.noreply.github.com> Date: Fri, 1 Dec 2023 18:43:50 +1100 Subject: [PATCH 1/4] feat: added cctp example --- V2/sdk/CCTP/.env.example | 5 ++ V2/sdk/CCTP/package.json | 16 +++++ V2/sdk/CCTP/src/index.ts | 120 ++++++++++++++++++++++++++++++++++++++ V2/sdk/CCTP/tsconfig.json | 9 +++ 4 files changed, 150 insertions(+) create mode 100644 V2/sdk/CCTP/.env.example create mode 100644 V2/sdk/CCTP/package.json create mode 100644 V2/sdk/CCTP/src/index.ts create mode 100644 V2/sdk/CCTP/tsconfig.json diff --git a/V2/sdk/CCTP/.env.example b/V2/sdk/CCTP/.env.example new file mode 100644 index 0000000..955f344 --- /dev/null +++ b/V2/sdk/CCTP/.env.example @@ -0,0 +1,5 @@ +# Copy this file to a file called .env in the same directory and fill in the values. + +PRIVATE_KEY= # 1a2b3c... your private key +INTEGRATOR_ID= # Squid integratorId can be obtained from https://l19g3aali76.typeform.com/integrator-id +AVALANCHE_RPC_ENDPOINT= # Avalanche RPC endpoint diff --git a/V2/sdk/CCTP/package.json b/V2/sdk/CCTP/package.json new file mode 100644 index 0000000..36fab4f --- /dev/null +++ b/V2/sdk/CCTP/package.json @@ -0,0 +1,16 @@ +{ + "scripts": { + "start": "ts-node src/index.ts" + }, + "dependencies": { + "@0xsquid/sdk": "^1.14.11", + "@0xsquid/squid-types": "^0.1.39", + "@openzeppelin/contracts": "^4.9.3", + "@types/node": "^18.11.10", + "@types/typescript": "^2.0.0", + "dotenv": "^16.3.1", + "ethers": "6.7.1", + "ts-node": "^10.9.1", + "typescript": "^4.9.3" + } +} diff --git a/V2/sdk/CCTP/src/index.ts b/V2/sdk/CCTP/src/index.ts new file mode 100644 index 0000000..91fed66 --- /dev/null +++ b/V2/sdk/CCTP/src/index.ts @@ -0,0 +1,120 @@ +// Import necessary libraries +import { ethers } from "ethers"; +import { Squid } from "@0xsquid/sdk"; + +// Load environment variables from .env file +import * as dotenv from "dotenv"; +dotenv.config(); + +const privateKey: string = process.env.PRIVATE_KEY!; +const integratorId: string = process.env.INTEGRATOR_ID!; // get one at https://form.typeform.com/to/cqFtqSvX +const ethereumRpcEndpoint: string = process.env.ETHEREUM_RPC_ENDPOINT!; + +// Define chain and token addresses +const ethereumChainId = "1"; // +const nobleChainId = "grand-1"; // +const usdcTokenEthereum = "0x07865c6E87B9F70255377e024ace6630C1Eaa37F"; +const usdcTokenNoble = "uusdc"; // + +// Define amount to be sent +const amount = "1000000"; // 0.01 USDC + +// Function to get Squid SDK instance +const getSDK = (): Squid => { + const squid = new Squid({ + baseUrl: "https://testnet.v2.api.squidrouter.com", + integratorId: integratorId, + }); + return squid; +}; + +// Main function +(async () => { + // Set up JSON RPC provider and signer + const provider = new ethers.JsonRpcProvider(ethereumRpcEndpoint); + const signer = new ethers.Wallet(privateKey, provider); + + // Initialize Squid SDK + const squid = getSDK(); + await squid.init(); + console.log("Initialized Squid SDK"); + + // Set up parameters for swapping tokens + const params = { + fromAddress: signer.address, + fromChain: ethereumChainId, + fromToken: usdcTokenEthereum, + fromAmount: amount, + toChain: nobleChainId, + toToken: usdcTokenNoble, + toAddress: "noble1zqnudqmjrgh9m3ec9yztkrn4ttx7ys64p87kkx", + slippage: 1, + slippageConfig: { + autoMode: 1, + }, + quoteOnly: false, + }; + + console.log("Parameters:", params); + + // Get the swap route using Squid SDK + const { route, requestId } = await squid.getRoute(params); + console.log("Calculated route:", route.estimate.toAmount); + + const { isApproved, message } = await squid.isRouteApproved({ + route, + sender: signer.address, + }); + + // check if route is approved + if (!isApproved) { + console.log("Route is not approved, approving now..."); + const approve = await squid.approveRoute({ signer, route }); + signer.provider.getNetwork; + } + console.log("Route is approved"); + + // Execute the swap transaction + const tx = (await squid.executeRoute({ + signer, + route, + })) as unknown as ethers.TransactionResponse; + const txReceipt = await tx.wait(); + + // Wait a few seconds before checking the status + await new Promise((resolve) => setTimeout(resolve, 5000)); + + // Retrieve the transaction's route status + const getStatusParams = { + transactionId: txReceipt.hash, + requestId: requestId, + fromChainId: ethereumChainId, + toChainId: nobleChainId, + bridgeType: "cctp", + }; + + console.log("checkig tx status...."); + async function waitForSuccess() { + await new Promise((resolve) => setTimeout(resolve, 5000)); + let isSuccess = false; + while (!isSuccess) { + try { + const status = await squid.getStatus(getStatusParams); + if (status && status.squidTransactionStatus === "success") { + console.log(status); + console.log("Transaction successful!"); + isSuccess = true; + } else { + console.log(status); + console.log("In progress...."); + await new Promise((resolve) => setTimeout(resolve, 5000)); // Wait for 5 seconds before the next check + } + } catch (error) { + console.log("Error:", error); + await new Promise((resolve) => setTimeout(resolve, 1000)); + } + } + } + + await waitForSuccess(); +})(); diff --git a/V2/sdk/CCTP/tsconfig.json b/V2/sdk/CCTP/tsconfig.json new file mode 100644 index 0000000..1c1d56d --- /dev/null +++ b/V2/sdk/CCTP/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "outDir": "dist", + "sourceMap": true + }, + "include": ["src/**/*"] +} From 08b0da07f6061d2b41b0f55b7ed01204f40c5fa1 Mon Sep 17 00:00:00 2001 From: 0x0Koda <12773720+0x0Koda@users.noreply.github.com> Date: Sun, 3 Dec 2023 14:24:31 +1100 Subject: [PATCH 2/4] fix: reverted to ethers 5 --- V2/sdk/CCTP/package.json | 6 +++--- V2/sdk/CCTP/src/index.ts | 27 +++++++++++++-------------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/V2/sdk/CCTP/package.json b/V2/sdk/CCTP/package.json index 36fab4f..f8cd924 100644 --- a/V2/sdk/CCTP/package.json +++ b/V2/sdk/CCTP/package.json @@ -3,13 +3,13 @@ "start": "ts-node src/index.ts" }, "dependencies": { - "@0xsquid/sdk": "^1.14.11", - "@0xsquid/squid-types": "^0.1.39", + "@0xsquid/sdk": "^2.8.1-beta.0", + "@0xsquid/squid-types": "^0.1.27", "@openzeppelin/contracts": "^4.9.3", "@types/node": "^18.11.10", "@types/typescript": "^2.0.0", "dotenv": "^16.3.1", - "ethers": "6.7.1", + "ethers": "^5.7.2", "ts-node": "^10.9.1", "typescript": "^4.9.3" } diff --git a/V2/sdk/CCTP/src/index.ts b/V2/sdk/CCTP/src/index.ts index 91fed66..6f2733f 100644 --- a/V2/sdk/CCTP/src/index.ts +++ b/V2/sdk/CCTP/src/index.ts @@ -8,21 +8,21 @@ dotenv.config(); const privateKey: string = process.env.PRIVATE_KEY!; const integratorId: string = process.env.INTEGRATOR_ID!; // get one at https://form.typeform.com/to/cqFtqSvX -const ethereumRpcEndpoint: string = process.env.ETHEREUM_RPC_ENDPOINT!; +const RpcEndpoint: string = process.env.RPC_ENDPOINT!; // Define chain and token addresses -const ethereumChainId = "1"; // -const nobleChainId = "grand-1"; // -const usdcTokenEthereum = "0x07865c6E87B9F70255377e024ace6630C1Eaa37F"; -const usdcTokenNoble = "uusdc"; // +const evmChainId = "43114"; +const nobleChainId = "noble-1"; +const usdcEVMToken = "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"; +const usdcTokenNoble = "uusdc"; // Define amount to be sent -const amount = "1000000"; // 0.01 USDC +const amount = "100000"; // 0.01 USDC // Function to get Squid SDK instance const getSDK = (): Squid => { const squid = new Squid({ - baseUrl: "https://testnet.v2.api.squidrouter.com", + baseUrl: "https://v2.api.squidrouter.com", integratorId: integratorId, }); return squid; @@ -31,7 +31,7 @@ const getSDK = (): Squid => { // Main function (async () => { // Set up JSON RPC provider and signer - const provider = new ethers.JsonRpcProvider(ethereumRpcEndpoint); + const provider = new ethers.providers.JsonRpcProvider(RpcEndpoint); const signer = new ethers.Wallet(privateKey, provider); // Initialize Squid SDK @@ -42,8 +42,8 @@ const getSDK = (): Squid => { // Set up parameters for swapping tokens const params = { fromAddress: signer.address, - fromChain: ethereumChainId, - fromToken: usdcTokenEthereum, + fromChain: evmChainId, + fromToken: usdcEVMToken, fromAmount: amount, toChain: nobleChainId, toToken: usdcTokenNoble, @@ -56,7 +56,6 @@ const getSDK = (): Squid => { }; console.log("Parameters:", params); - // Get the swap route using Squid SDK const { route, requestId } = await squid.getRoute(params); console.log("Calculated route:", route.estimate.toAmount); @@ -78,7 +77,7 @@ const getSDK = (): Squid => { const tx = (await squid.executeRoute({ signer, route, - })) as unknown as ethers.TransactionResponse; + })) as unknown as ethers.providers.TransactionResponse; const txReceipt = await tx.wait(); // Wait a few seconds before checking the status @@ -86,9 +85,9 @@ const getSDK = (): Squid => { // Retrieve the transaction's route status const getStatusParams = { - transactionId: txReceipt.hash, + transactionId: txReceipt.transactionHash, requestId: requestId, - fromChainId: ethereumChainId, + fromChainId: evmChainId, toChainId: nobleChainId, bridgeType: "cctp", }; From 2d4e4e4cb240aba4bda11c9f2a7970adffe24be0 Mon Sep 17 00:00:00 2001 From: 0x0Koda <12773720+0x0Koda@users.noreply.github.com> Date: Sun, 3 Dec 2023 14:58:12 +1100 Subject: [PATCH 3/4] updated timeout --- V2/sdk/CCTP/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/V2/sdk/CCTP/src/index.ts b/V2/sdk/CCTP/src/index.ts index 6f2733f..18f3112 100644 --- a/V2/sdk/CCTP/src/index.ts +++ b/V2/sdk/CCTP/src/index.ts @@ -94,7 +94,7 @@ const getSDK = (): Squid => { console.log("checkig tx status...."); async function waitForSuccess() { - await new Promise((resolve) => setTimeout(resolve, 5000)); + await new Promise((resolve) => setTimeout(resolve, 1000)); let isSuccess = false; while (!isSuccess) { try { From 31eff1863afb7cfae9e7f2260bb96808ac2f9161 Mon Sep 17 00:00:00 2001 From: 0x0Koda <12773720+0x0Koda@users.noreply.github.com> Date: Tue, 5 Dec 2023 14:07:06 +1100 Subject: [PATCH 4/4] feat: updated amount for cctp example --- V2/sdk/CCTP/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/V2/sdk/CCTP/src/index.ts b/V2/sdk/CCTP/src/index.ts index 18f3112..5eefd18 100644 --- a/V2/sdk/CCTP/src/index.ts +++ b/V2/sdk/CCTP/src/index.ts @@ -17,7 +17,7 @@ const usdcEVMToken = "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"; const usdcTokenNoble = "uusdc"; // Define amount to be sent -const amount = "100000"; // 0.01 USDC +const amount = "100000"; // 0.1 USDC // Function to get Squid SDK instance const getSDK = (): Squid => {