Code example

Full code example of using Squid's contract call feature

In the example provided below we send WETH from Ethereum to USDC.e on Avalance. Then with the contract calls feature, attaching at the end of the Squid Route a swap to SUSHI token through Sushi Router (Uniswapv2) contract.

import { Squid } from "@0xsquid/sdk";
import { ethers } from "ethers";

const getSDK = (): Squid => {
  const squid = new Squid({
    baseUrl: "https://testnet.api.0xsquid.com"
  });
  return squid;
};

const privateKey =
  "<YOUR_PRIVATE_KEY_HERE";
const ethRpcEndPoint = 
  "https://goerli.infura.io/v3/<YOUR_INFURA_KEY_OR_OTHER_RPC_PROVIDER>";

(async () => {
    // set up your RPC provider and signer
    const provider = new ethers.providers.JsonRpcProvider(ethRpcEndPoint);
    const signer = new ethers.Wallet(privateKey, provider);

    // instantiate the SDK
    const squid = getSDK();
    // init the SDK
    await squid.init();
    console.log("Squid inited");

    const ethereumId = 1;
    const avalancheId = 43114;
    const sushiRouter = "0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506";
    const sushiToken = "0x37B608519F91f70F2EeB0e5Ed9AF4061722e4F76";
    const usdceToken = "0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664";
    const wethToken = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2";
    const amount = "1000000000000000000";
    const minAmount = "0";

    const usdcContractInterface = new ethers.utils.Interface(erc20Abi as any);
    const approveEncodeData = usdcContractInterface.encodeFunctionData(
    "approve",
    [
        sushiRouter,
        "0"
    ]
    );

    const routerContractInterface = new ethers.utils.Interface(uniswapV2 as any);
    const swapEncodeData = routerContractInterface.encodeFunctionData(
    "swapExactTokensForTokens",
    [
        amount,
        minAmount,
        [usdceToken, sushiToken],
        signer.address,
        new Date().getTime() + 1e6
    ]
    );

    const { route } = await squid.getRoute({
    fromAddress: signer.address,
    toAddress: signer.address,
    fromChain: ethereumId,
    fromToken: wethToken,
    fromAmount: amount,
    toChain: avalancheId,
    toToken: usdceToken,
    slippage: 99,
    customContractCalls: [
        {
        callType: 1,
        target: usdceToken,
        value: "0",
        callData: approveEncodeData,
        payload: {
            tokenAddress: usdceToken,
            inputPos: 1
        },
        estimatedGas: "400000"
        },
        {
        callType: 1,
        target: sushiRouter,
        value: "0",
        callData: swapEncodeData,
        payload: {
            tokenAddress: usdceToken,
            inputPos: 0
        },
        estimatedGas: "400000"
        }
    ]
    });

    const tx = await squid.executeRoute({
    signer,
    route
    });
    const txReceipt = await tx.wait();
})();

As you can see, we encode two contract calls, the first one is an "approval" one, that allows our multi-call contract to spend the USDC.e to execute the swap with Sushi Router; and the second one is the swap itself.

Last updated