mirror of
				https://github.com/Instadapp/dsa-connectors-2.0.git
				synced 2024-07-29 21:57:39 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			463 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			463 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { expect } from "chai";
 | 
						|
import hre from "hardhat";
 | 
						|
const { waffle, ethers } = hre;
 | 
						|
const { provider } = waffle;
 | 
						|
const { BigNumber, utils } = ethers;
 | 
						|
 | 
						|
import {deployAndEnableConnector} from "../../../scripts/tests/deployAndEnableConnector";
 | 
						|
import {buildDSAv2} from "../../../scripts/tests/buildDSAv2";
 | 
						|
import {encodeSpells} from "../../../scripts/tests/encodeSpells";
 | 
						|
import {addresses} from "../../../scripts/tests/mainnet/addresses";
 | 
						|
import {abis} from "../../../scripts/constant/abis";
 | 
						|
import {impersonateAccounts} from "../../../scripts/tests/impersonate";
 | 
						|
import type { Signer, Contract, BigNumberish } from "ethers";
 | 
						|
import {forkReset, sendEth, mineNBlock} from "./utils";
 | 
						|
import { ConnectV2Ubiquity__factory } from "../../../typechain";
 | 
						|
 | 
						|
import { abi as implementationsABI } from "../../../scripts/constant/abi/core/InstaImplementations.json";
 | 
						|
const implementationsMappingAddr = "0xCBA828153d3a85b30B5b912e1f2daCac5816aE9D";
 | 
						|
 | 
						|
describe("Ubiquity", function () {
 | 
						|
  const ubiquityTest = "UBIQUITY-TEST-A";
 | 
						|
 | 
						|
  const BOND = "0x2dA07859613C14F6f05c97eFE37B9B4F212b5eF5";
 | 
						|
  const UAD = "0x0F644658510c95CB46955e55D7BA9DDa9E9fBEc6";
 | 
						|
  const DAI = "0x6B175474E89094C44Da98b954EedeAC495271d0F";
 | 
						|
  const USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48";
 | 
						|
  const USDT = "0xdAC17F958D2ee523a2206206994597C13D831ec7";
 | 
						|
  const CRV3 = "0x6c3F90f043a72FA612cbac8115EE7e52BDe6E490";
 | 
						|
  const POOL3 = "0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7";
 | 
						|
  const UAD3CRVF = "0x20955CB69Ae1515962177D164dfC9522feef567E";
 | 
						|
 | 
						|
  const ethWhaleAddress = "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2";
 | 
						|
  const uadWhaleAddress = "0xefC0e701A824943b469a694aC564Aa1efF7Ab7dd";
 | 
						|
 | 
						|
  const blockFork = 13097100;
 | 
						|
  const one = BigNumber.from(10).pow(18);
 | 
						|
  const onep = BigNumber.from(10).pow(6);
 | 
						|
  const ABI = [
 | 
						|
    "function balanceOf(address owner) view returns (uint256)",
 | 
						|
    "function allowance(address owner, address spender) external view returns (uint256)",
 | 
						|
    "function transfer(address to, uint amount) returns (boolean)",
 | 
						|
    "function remove_liquidity_one_coin(uint256 _burn_amount, int128 i, uint256 _min_received) external returns (uint256)",
 | 
						|
    "function add_liquidity(uint256[3],uint256) returns (uint256)",
 | 
						|
    "function approve(address, uint256) external",
 | 
						|
    "function holderTokens(address) view returns (uint256[])",
 | 
						|
    "function getBond(uint256) view returns (tuple(address,uint256,uint256,uint256,uint256,uint256))"
 | 
						|
  ];
 | 
						|
  let dsa: Contract;
 | 
						|
  let POOL3Contract: Contract;
 | 
						|
  let CRV3Contract: Contract;
 | 
						|
  let uAD3CRVfContract: Contract;
 | 
						|
  let uADContract: Contract;
 | 
						|
  let DAIContract: Contract;
 | 
						|
  let USDCContract: Contract;
 | 
						|
  let USDTContract: Contract;
 | 
						|
  let BONDContract: Contract;
 | 
						|
  let instaIndex: Contract;
 | 
						|
  let instaConnectorsV2: Contract;
 | 
						|
  let connector: Contract;
 | 
						|
  let instaImplementationsMapping;
 | 
						|
  let InstaAccountV2DefaultImpl;
 | 
						|
 | 
						|
  let uadWhale;
 | 
						|
 | 
						|
  const bondingShare = async function (address: any) {
 | 
						|
    let lpAmount = BigNumber.from(0);
 | 
						|
    let lpAmountTotal = BigNumber.from(0);
 | 
						|
    let bondId = -1;
 | 
						|
 | 
						|
    const bondIds = await BONDContract.holderTokens(address);
 | 
						|
    const bondN = bondIds?.length || 0;
 | 
						|
 | 
						|
    if (bondN) {
 | 
						|
      for await (bondId of bondIds) {
 | 
						|
        lpAmountTotal = lpAmountTotal.add((await BONDContract.getBond(bondId))[5]);
 | 
						|
      }
 | 
						|
      bondId = Number(bondIds[bondN - 1]);
 | 
						|
      lpAmount = (await BONDContract.getBond(bondId))[5];
 | 
						|
    }
 | 
						|
    return { bondId, bondN, lpAmount, lpAmountTotal };
 | 
						|
  };
 | 
						|
 | 
						|
  const depositAndGetOneBond = async function () {
 | 
						|
    await dsaDepositUAD3CRVf(100);
 | 
						|
    dsa.cast(
 | 
						|
      ...encodeSpells([
 | 
						|
        {
 | 
						|
          connector: ubiquityTest,
 | 
						|
          method: "deposit",
 | 
						|
          args: [UAD3CRVF, one.mul(100), 1, 0, 0]
 | 
						|
        }
 | 
						|
      ]),
 | 
						|
      uadWhaleAddress
 | 
						|
    );
 | 
						|
  };
 | 
						|
 | 
						|
  before(async () => {
 | 
						|
    // await forkReset(blockFork);
 | 
						|
    await hre.network.provider.request({
 | 
						|
      method: "hardhat_reset",
 | 
						|
      params: [
 | 
						|
        {
 | 
						|
          forking: {
 | 
						|
            // @ts-ignore
 | 
						|
            jsonRpcUrl: hre.config.networks.hardhat.forking.url,
 | 
						|
            blockNumber: 13097100,
 | 
						|
          },
 | 
						|
        },
 | 
						|
      ],
 | 
						|
    });
 | 
						|
    [uadWhale] = await impersonateAccounts([uadWhaleAddress]);
 | 
						|
    const [ethWhale] = await impersonateAccounts([ethWhaleAddress]);
 | 
						|
 | 
						|
    await sendEth(ethWhale, uadWhaleAddress, 100);
 | 
						|
    POOL3Contract = new ethers.Contract(POOL3, ABI, uadWhale);
 | 
						|
    CRV3Contract = new ethers.Contract(CRV3, ABI, uadWhale);
 | 
						|
    uAD3CRVfContract = new ethers.Contract(UAD3CRVF, ABI, uadWhale);
 | 
						|
    uADContract = new ethers.Contract(UAD, ABI, uadWhale);
 | 
						|
    DAIContract = new ethers.Contract(DAI, ABI, uadWhale);
 | 
						|
    USDCContract = new ethers.Contract(USDC, ABI, uadWhale);
 | 
						|
    USDTContract = new ethers.Contract(USDT, ABI, uadWhale);
 | 
						|
    BONDContract = new ethers.Contract(BOND, ABI, uadWhale);
 | 
						|
    dsa = (await buildDSAv2(uadWhaleAddress)).connect(uadWhale);
 | 
						|
    await sendEth(ethWhale, dsa.address, 100);
 | 
						|
    await sendEth(ethWhale, uadWhaleAddress, 100);
 | 
						|
 | 
						|
    instaIndex = new ethers.Contract(addresses.core.instaIndex, abis.core.instaIndex, ethWhale);
 | 
						|
 | 
						|
    const masterAddress = await instaIndex.master();
 | 
						|
    const [master] = await impersonateAccounts([masterAddress]);
 | 
						|
    await sendEth(ethWhale, masterAddress, 100);
 | 
						|
 | 
						|
    instaConnectorsV2 = new ethers.Contract(addresses.core.connectorsV2, abis.core.connectorsV2);
 | 
						|
 | 
						|
    instaImplementationsMapping = await ethers.getContractAt(implementationsABI, implementationsMappingAddr);
 | 
						|
    InstaAccountV2DefaultImpl = await ethers.getContractFactory("InstaDefaultImplementation");
 | 
						|
    InstaAccountV2DefaultImpl = await InstaAccountV2DefaultImpl.deploy(addresses.core.instaIndex);
 | 
						|
    await InstaAccountV2DefaultImpl.deployed();
 | 
						|
    await (
 | 
						|
      await instaImplementationsMapping.connect(master).setDefaultImplementation(InstaAccountV2DefaultImpl.address)
 | 
						|
    ).wait();
 | 
						|
 | 
						|
    connector = await deployAndEnableConnector({
 | 
						|
      connectorName: ubiquityTest,
 | 
						|
      contractArtifact: ConnectV2Ubiquity__factory,
 | 
						|
      signer: master,
 | 
						|
      connectors: instaConnectorsV2
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  const logAll = async function () {
 | 
						|
    console.log("dsa            eth", utils.formatEther(await ethers.provider.getBalance(dsa.address)));
 | 
						|
    console.log("dsa            dai", utils.formatEther(await DAIContract.balanceOf(dsa.address)));
 | 
						|
    console.log("dsa           usdc", utils.formatUnits(await USDCContract.balanceOf(dsa.address), 6));
 | 
						|
    console.log("dsa           usdt", utils.formatUnits(await USDTContract.balanceOf(dsa.address), 6));
 | 
						|
    console.log("dsa            uad", utils.formatEther(await uADContract.balanceOf(dsa.address)));
 | 
						|
    console.log("dsa           3CRV", utils.formatEther(await CRV3Contract.balanceOf(dsa.address)));
 | 
						|
    console.log("dsa      uad3CRV-f", utils.formatEther(await uAD3CRVfContract.balanceOf(dsa.address)));
 | 
						|
    const { bondId, bondN, lpAmount, lpAmountTotal } = await bondingShare(dsa.address);
 | 
						|
    console.log("dsa        n bonds", utils.formatEther(lpAmountTotal), bondN);
 | 
						|
    console.log("dsa      last bond", utils.formatEther(lpAmount), bondId);
 | 
						|
  };
 | 
						|
 | 
						|
  afterEach(logAll);
 | 
						|
 | 
						|
  const dsaDepositUAD3CRVf = async (amount: BigNumberish) => {
 | 
						|
    await uAD3CRVfContract.transfer(dsa.address, one.mul(amount));
 | 
						|
  };
 | 
						|
 | 
						|
  const dsaDepositUAD = async (amount: BigNumberish) => {
 | 
						|
    await uAD3CRVfContract.remove_liquidity_one_coin(one.mul(amount).mul(110).div(100), 0, one.mul(amount));
 | 
						|
    await uADContract.transfer(dsa.address, one.mul(amount));
 | 
						|
  };
 | 
						|
 | 
						|
  const dsaDepositCRV3 = async (amount: BigNumberish) => {
 | 
						|
    await uAD3CRVfContract.remove_liquidity_one_coin(one.mul(amount).mul(110).div(100), 1, one.mul(amount));
 | 
						|
    await CRV3Contract.transfer(dsa.address, one.mul(amount));
 | 
						|
  };
 | 
						|
 | 
						|
  const dsaDepositDAI = async (amount: BigNumberish) => {
 | 
						|
    await uAD3CRVfContract.remove_liquidity_one_coin(
 | 
						|
      one.mul(amount).mul(120).div(100),
 | 
						|
      1,
 | 
						|
      one.mul(amount).mul(110).div(100)
 | 
						|
    );
 | 
						|
    await POOL3Contract.remove_liquidity_one_coin(one.mul(amount).mul(110).div(100), 0, one.mul(amount));
 | 
						|
    await DAIContract.transfer(dsa.address, one.mul(amount));
 | 
						|
  };
 | 
						|
  const dsaDepositUSDC = async (amount: BigNumberish) => {
 | 
						|
    await uAD3CRVfContract.remove_liquidity_one_coin(
 | 
						|
      one.mul(amount).mul(120).div(100),
 | 
						|
      1,
 | 
						|
      one.mul(amount).mul(110).div(100)
 | 
						|
    );
 | 
						|
    await POOL3Contract.remove_liquidity_one_coin(one.mul(amount).mul(110).div(100), 1, onep.mul(amount));
 | 
						|
    await USDCContract.transfer(dsa.address, onep.mul(amount));
 | 
						|
  };
 | 
						|
  const dsaDepositUSDT = async (amount: BigNumberish) => {
 | 
						|
    await uAD3CRVfContract.remove_liquidity_one_coin(
 | 
						|
      one.mul(amount).mul(120).div(100),
 | 
						|
      1,
 | 
						|
      one.mul(amount).mul(110).div(100)
 | 
						|
    );
 | 
						|
    await POOL3Contract.remove_liquidity_one_coin(one.mul(amount).mul(110).div(100), 2, onep.mul(amount));
 | 
						|
    await USDTContract.transfer(dsa.address, onep.mul(amount));
 | 
						|
  };
 | 
						|
 | 
						|
  describe("Deposit", function () {
 | 
						|
    it("should deposit uAD3CRVf to get Ubiquity Bonding Shares", async function () {
 | 
						|
      await logAll();
 | 
						|
      await dsaDepositUAD3CRVf(100);
 | 
						|
      expect((await bondingShare(dsa.address)).lpAmount).to.be.equal(0);
 | 
						|
      await expect(
 | 
						|
        dsa.cast(
 | 
						|
          ...encodeSpells([
 | 
						|
            {
 | 
						|
              connector: ubiquityTest,
 | 
						|
              method: "deposit",
 | 
						|
              args: [UAD3CRVF, one.mul(100), 4, 0, 0]
 | 
						|
            }
 | 
						|
          ]),
 | 
						|
          uadWhaleAddress
 | 
						|
        )
 | 
						|
      ).to.be.not.reverted;
 | 
						|
      expect((await bondingShare(dsa.address)).lpAmount).to.be.gt(0);
 | 
						|
    });
 | 
						|
 | 
						|
    it("should deposit uAD to get Ubiquity Bonding Shares", async function () {
 | 
						|
      await dsaDepositUAD(100);
 | 
						|
      await expect(
 | 
						|
        dsa.cast(
 | 
						|
          ...encodeSpells([
 | 
						|
            {
 | 
						|
              connector: ubiquityTest,
 | 
						|
              method: "deposit",
 | 
						|
              args: [UAD, one.mul(100), 4, 0, 0]
 | 
						|
            }
 | 
						|
          ]),
 | 
						|
          uadWhaleAddress
 | 
						|
        )
 | 
						|
      ).to.be.not.reverted;
 | 
						|
      expect((await bondingShare(dsa.address)).lpAmount).to.be.gt(0);
 | 
						|
    });
 | 
						|
 | 
						|
    it("should deposit 3CRV to get Ubiquity Bonding Shares", async function () {
 | 
						|
      await dsaDepositCRV3(100);
 | 
						|
      await expect(
 | 
						|
        dsa.cast(
 | 
						|
          ...encodeSpells([
 | 
						|
            {
 | 
						|
              connector: ubiquityTest,
 | 
						|
              method: "deposit",
 | 
						|
              args: [CRV3, one.mul(100), 4, 0, 0]
 | 
						|
            }
 | 
						|
          ]),
 | 
						|
          uadWhaleAddress
 | 
						|
        )
 | 
						|
      ).to.be.not.reverted;
 | 
						|
      expect((await bondingShare(dsa.address)).lpAmount).to.be.gt(0);
 | 
						|
    });
 | 
						|
 | 
						|
    it("should deposit DAI to get Ubiquity Bonding Shares", async function () {
 | 
						|
      await dsaDepositDAI(100);
 | 
						|
      await expect(
 | 
						|
        dsa.cast(
 | 
						|
          ...encodeSpells([
 | 
						|
            {
 | 
						|
              connector: ubiquityTest,
 | 
						|
              method: "deposit",
 | 
						|
              args: [DAI, one.mul(100), 4, 0, 0]
 | 
						|
            }
 | 
						|
          ]),
 | 
						|
          uadWhaleAddress
 | 
						|
        )
 | 
						|
      ).to.be.not.reverted;
 | 
						|
      expect((await bondingShare(dsa.address)).lpAmount).to.be.gt(0);
 | 
						|
    });
 | 
						|
 | 
						|
    it("should deposit USDC to get Ubiquity Bonding Shares", async function () {
 | 
						|
      await dsaDepositUSDC(100);
 | 
						|
      await expect(
 | 
						|
        dsa.cast(
 | 
						|
          ...encodeSpells([
 | 
						|
            {
 | 
						|
              connector: ubiquityTest,
 | 
						|
              method: "deposit",
 | 
						|
              args: [USDC, onep.mul(100), 4, 0, 0]
 | 
						|
            }
 | 
						|
          ]),
 | 
						|
          uadWhaleAddress
 | 
						|
        )
 | 
						|
      ).to.be.not.reverted;
 | 
						|
      expect((await bondingShare(dsa.address)).lpAmount).to.be.gt(0);
 | 
						|
    });
 | 
						|
 | 
						|
    it("should deposit USDT to get Ubiquity Bonding Shares", async function () {
 | 
						|
      await dsaDepositUSDT(100);
 | 
						|
      await expect(
 | 
						|
        dsa.cast(
 | 
						|
          ...encodeSpells([
 | 
						|
            {
 | 
						|
              connector: ubiquityTest,
 | 
						|
              method: "deposit",
 | 
						|
              args: [USDT, onep.mul(100), 4, 0, 0]
 | 
						|
            }
 | 
						|
          ]),
 | 
						|
          uadWhaleAddress
 | 
						|
        )
 | 
						|
      ).to.be.not.reverted;
 | 
						|
      expect((await bondingShare(dsa.address)).lpAmount).to.be.gt(0);
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  describe("Withdraw", function () {
 | 
						|
    let bondId = -1;
 | 
						|
 | 
						|
    before(async () => {
 | 
						|
      await depositAndGetOneBond();
 | 
						|
      await depositAndGetOneBond();
 | 
						|
      await depositAndGetOneBond();
 | 
						|
      await depositAndGetOneBond();
 | 
						|
      await depositAndGetOneBond();
 | 
						|
      await depositAndGetOneBond();
 | 
						|
      ({ bondId } = await bondingShare(dsa.address));
 | 
						|
 | 
						|
      await logAll();
 | 
						|
      console.log("Mining 50 000 blocks for more than one week, please wait...");
 | 
						|
      await mineNBlock(50000, 1);
 | 
						|
    });
 | 
						|
 | 
						|
    it("Should deposit and withdraw DAI", async function () {
 | 
						|
      await expect(
 | 
						|
        dsa.cast(
 | 
						|
          ...encodeSpells([
 | 
						|
            {
 | 
						|
              connector: ubiquityTest,
 | 
						|
              method: "withdraw",
 | 
						|
              args: [bondId, DAI, 0, 0]
 | 
						|
            }
 | 
						|
          ]),
 | 
						|
          uadWhaleAddress
 | 
						|
        )
 | 
						|
      ).to.be.not.reverted;
 | 
						|
    });
 | 
						|
 | 
						|
    it("Should deposit and withdraw USDC", async function () {
 | 
						|
      // await expect(
 | 
						|
      dsa.cast(
 | 
						|
        ...encodeSpells([
 | 
						|
          {
 | 
						|
            connector: ubiquityTest,
 | 
						|
            method: "withdraw",
 | 
						|
            args: [bondId - 1, USDC, 0, 0]
 | 
						|
          }
 | 
						|
        ]),
 | 
						|
        uadWhaleAddress
 | 
						|
      );
 | 
						|
      // ).to.be.not.reverted;
 | 
						|
    });
 | 
						|
 | 
						|
    it("Should deposit and withdraw USDT", async function () {
 | 
						|
      await expect(
 | 
						|
        dsa.cast(
 | 
						|
          ...encodeSpells([
 | 
						|
            {
 | 
						|
              connector: ubiquityTest,
 | 
						|
              method: "withdraw",
 | 
						|
              args: [bondId - 2, USDT, 0, 0]
 | 
						|
            }
 | 
						|
          ]),
 | 
						|
          uadWhaleAddress
 | 
						|
        )
 | 
						|
      ).to.be.not.reverted;
 | 
						|
    });
 | 
						|
 | 
						|
    it("Should deposit and withdraw UAD", async function () {
 | 
						|
      await expect(
 | 
						|
        dsa.cast(
 | 
						|
          ...encodeSpells([
 | 
						|
            {
 | 
						|
              connector: ubiquityTest,
 | 
						|
              method: "withdraw",
 | 
						|
              args: [bondId - 3, UAD, 0, 0]
 | 
						|
            }
 | 
						|
          ]),
 | 
						|
          uadWhaleAddress
 | 
						|
        )
 | 
						|
      ).to.be.not.reverted;
 | 
						|
    });
 | 
						|
 | 
						|
    it("Should deposit and withdraw CRV3", async function () {
 | 
						|
      await expect(
 | 
						|
        dsa.cast(
 | 
						|
          ...encodeSpells([
 | 
						|
            {
 | 
						|
              connector: ubiquityTest,
 | 
						|
              method: "withdraw",
 | 
						|
              args: [bondId - 4, CRV3, 0, 0]
 | 
						|
            }
 | 
						|
          ]),
 | 
						|
          uadWhaleAddress
 | 
						|
        )
 | 
						|
      ).to.be.not.reverted;
 | 
						|
    });
 | 
						|
 | 
						|
    it("Should deposit and withdraw UAD3CRVF", async function () {
 | 
						|
      await expect(
 | 
						|
        dsa.cast(
 | 
						|
          ...encodeSpells([
 | 
						|
            {
 | 
						|
              connector: ubiquityTest,
 | 
						|
              method: "withdraw",
 | 
						|
              args: [bondId - 5, UAD3CRVF, 0, 0]
 | 
						|
            }
 | 
						|
          ]),
 | 
						|
          uadWhaleAddress
 | 
						|
        )
 | 
						|
      ).to.be.not.reverted;
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  describe("DSA wallet setup", function () {
 | 
						|
    it("Should have contracts deployed.", async function () {
 | 
						|
      expect(POOL3Contract.address).to.be.properAddress;
 | 
						|
      expect(CRV3Contract.address).to.be.properAddress;
 | 
						|
      expect(uADContract.address).to.be.properAddress;
 | 
						|
      expect(uAD3CRVfContract.address).to.be.properAddress;
 | 
						|
      expect(DAIContract.address).to.be.properAddress;
 | 
						|
      expect(USDCContract.address).to.be.properAddress;
 | 
						|
      expect(USDTContract.address).to.be.properAddress;
 | 
						|
      expect(BONDContract.address).to.be.properAddress;
 | 
						|
      expect(instaIndex.address).to.be.properAddress;
 | 
						|
      expect(instaConnectorsV2.address).to.be.properAddress;
 | 
						|
      expect(connector.address).to.be.properAddress;
 | 
						|
      expect(dsa.address).to.be.properAddress;
 | 
						|
    });
 | 
						|
    it("Should deposit uAD3CRVf into DSA wallet", async function () {
 | 
						|
      await dsaDepositUAD3CRVf(100);
 | 
						|
      expect(await uAD3CRVfContract.balanceOf(dsa.address)).to.be.gte(one.mul(100));
 | 
						|
    });
 | 
						|
    it("Should deposit uAD into DSA wallet", async function () {
 | 
						|
      await dsaDepositUAD(100);
 | 
						|
      expect(await uADContract.balanceOf(dsa.address)).to.be.gte(one.mul(100));
 | 
						|
    });
 | 
						|
    it("Should deposit 3CRV into DSA wallet", async function () {
 | 
						|
      await dsaDepositCRV3(100);
 | 
						|
      expect(await CRV3Contract.balanceOf(dsa.address)).to.be.gte(one.mul(100));
 | 
						|
    });
 | 
						|
    it("Should deposit DAI into DSA wallet", async function () {
 | 
						|
      await dsaDepositDAI(100);
 | 
						|
      expect(await DAIContract.balanceOf(dsa.address)).to.be.gte(one.mul(100));
 | 
						|
    });
 | 
						|
    it("Should deposit USDC into DSA wallet", async function () {
 | 
						|
      await dsaDepositUSDC(100);
 | 
						|
      expect(await USDCContract.balanceOf(dsa.address)).to.be.gte(onep.mul(100));
 | 
						|
    });
 | 
						|
    it("Should deposit USDT into DSA wallet", async function () {
 | 
						|
      await dsaDepositUSDT(100);
 | 
						|
      expect(await USDTContract.balanceOf(dsa.address)).to.be.gte(onep.mul(100));
 | 
						|
    });
 | 
						|
  });
 | 
						|
});
 |