From 0fca7d7d0001969b005843b70bc8b0d0cdc7550d Mon Sep 17 00:00:00 2001 From: Mark Aiken Date: Sat, 20 Nov 2021 14:18:15 -0800 Subject: [PATCH] Functional link deposit, borrow, payback, and withdraw --- contracts/polygon/connectors/qidao/main.sol | 1 - scripts/constant/qidao/polygonTokens.js | 7 ++ scripts/constant/qidao/vaults.js | 3 + scripts/tests/addLiquidity.ts | 74 ++++++++++++--------- test/qidao/qidao.test.js | 46 +++++++++++++ 5 files changed, 100 insertions(+), 31 deletions(-) diff --git a/contracts/polygon/connectors/qidao/main.sol b/contracts/polygon/connectors/qidao/main.sol index 47bb5774..b77ee17a 100644 --- a/contracts/polygon/connectors/qidao/main.sol +++ b/contracts/polygon/connectors/qidao/main.sol @@ -153,7 +153,6 @@ abstract contract QiDaoResolver is Events, Helpers { erc20StablecoinInterface vault = erc20StablecoinInterface(vaultAddress); vault.borrowToken(_vaultId, _amt); - vault.transferVault(_vaultId, address(this)); setUint(setAmtId, _amt); setUint(getVaultId, _vaultId); diff --git a/scripts/constant/qidao/polygonTokens.js b/scripts/constant/qidao/polygonTokens.js index 998f21ba..e29099f2 100644 --- a/scripts/constant/qidao/polygonTokens.js +++ b/scripts/constant/qidao/polygonTokens.js @@ -6,4 +6,11 @@ module.exports = { "address": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "decimals": 18 }, + "link": { + "type": "token", + "symbol": "LINK", + "name": "ChainLink Token", + "address": "0x53e0bca35ec356bd5dddfebbd1fc0fd03fabad39", + "decimals": 18 + }, } diff --git a/scripts/constant/qidao/vaults.js b/scripts/constant/qidao/vaults.js index c4e7992f..5551ed7e 100644 --- a/scripts/constant/qidao/vaults.js +++ b/scripts/constant/qidao/vaults.js @@ -1,5 +1,8 @@ module.exports = { matic: { address: "0xa3fa99a148fa48d14ed51d610c367c61876997f1" + }, + link: { + address: "0x61167073E31b1DAd85a3E531211c7B8F1E5cAE72" } } diff --git a/scripts/tests/addLiquidity.ts b/scripts/tests/addLiquidity.ts index f29d6374..46080a59 100644 --- a/scripts/tests/addLiquidity.ts +++ b/scripts/tests/addLiquidity.ts @@ -8,14 +8,15 @@ const mineTx = async (tx: any) => { }; const tokenMapping: Record = { - usdc: { - impersonateSigner: "0xfcb19e6a322b27c06842a71e8c725399f049ae3a", - address: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", - abi: [ - "function mint(address _to, uint256 _amount) external returns (bool);", - ], - process: async function(owner: Signer | Provider, to: any, amt: any) { - const contract = new ethers.Contract(this.address, this.abi, owner); + eth:{ + usdc: { + impersonateSigner: "0xfcb19e6a322b27c06842a71e8c725399f049ae3a", + address: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + abi: [ + "function mint(address _to, uint256 _amount) external returns (bool);", + ], + process: async function(owner: Signer | Provider, to: any, amt: any) { + const contract = new ethers.Contract(this.address, this.abi, owner); await mineTx(contract.mint(to, amt)); }, @@ -39,40 +40,53 @@ const tokenMapping: Record = { process: async function(owner: Signer | Provider, address: any, amt: any) { const contract = new ethers.Contract(this.address, this.abi, owner); - await mineTx(contract.issue(amt)); - await mineTx(contract.transfer(address, amt)); + await mineTx(contract.issue(amt)); + await mineTx(contract.transfer(address, amt)); + }, }, - }, - wbtc: { - impersonateSigner: "0xCA06411bd7a7296d7dbdd0050DFc846E95fEBEB7", - address: "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", - abi: ["function mint(address _to, uint256 _amount) public returns (bool)"], - process: async function(owner: Signer | Provider, address: any, amt: any) { - const contract = new ethers.Contract(this.address, this.abi, owner); - await mineTx(contract.mint(address, amt)); - }, - }, - inst: { - impersonateSigner: "0x75e89d5979E4f6Fba9F97c104c2F0AFB3F1dcB88", - address: "0x6f40d4a6237c257fff2db00fa0510deeecd303eb", - abi: ["function transfer(address to, uint value)"], - process: async function(owner: Signer | Provider, address: any, amt: any) { - const contract = new ethers.Contract(this.address, this.abi, owner); - await mineTx(contract.transfer(address, amt)); + wbtc: { + impersonateSigner: "0xCA06411bd7a7296d7dbdd0050DFc846E95fEBEB7", + address: "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", + abi: ["function mint(address _to, uint256 _amount) public returns (bool)"], + process: async function(owner: Signer | Provider, address: any, amt: any) { + const contract = new ethers.Contract(this.address, this.abi, owner); + await mineTx(contract.mint(address, amt)); + }, }, + inst: { + impersonateSigner: "0x75e89d5979E4f6Fba9F97c104c2F0AFB3F1dcB88", + address: "0x6f40d4a6237c257fff2db00fa0510deeecd303eb", + abi: ["function transfer(address to, uint value)"], + process: async function(owner: Signer | Provider, address: any, amt: any) { + const contract = new ethers.Contract(this.address, this.abi, owner); + await mineTx(contract.transfer(address, amt)); + }, + }, }, + polygon: { + link: { + impersonateSigner: "0x7d3a61907f6e2ef5ed901b6d9e5baf36827625af", + abi: ["function transfer(address to, uint value)"], + address: "0x53e0bca35ec356bd5dddfebbd1fc0fd03fabad39", + process: async function (owner, to, amt) { + const contract = new ethers.Contract(this.address, this.abi, owner); + await mineTx(contract.transfer(to, amt)); + }, + } + } }; -export async function addLiquidity(tokenName: string, address: any, amt: any) { +export async function addLiquidity(tokenName: string, address: any, amt: any, chain: string) { const [signer] = await ethers.getSigners(); + const _chain = chain ? chain : 'eth'; tokenName = tokenName.toLowerCase(); - if (!tokenMapping[tokenName]) { + if (!tokenMapping[_chain][tokenName]) { throw new Error( `Add liquidity doesn't support the following token: ${tokenName}` ); } - const token = tokenMapping[tokenName]; + const token = tokenMapping[_chain][tokenName]; const [impersonatedSigner] = await impersonateAccounts([ token.impersonateSigner, diff --git a/test/qidao/qidao.test.js b/test/qidao/qidao.test.js index d7047161..bff71bd1 100644 --- a/test/qidao/qidao.test.js +++ b/test/qidao/qidao.test.js @@ -69,6 +69,9 @@ describe("QiDao", function() { parseEther("10") ); }); + it("Deposit LINK into DSA wallet", async function() { + await addLiquidity("link", dsaWallet0.address, parseEther("100"), "polygon") + }) }); describe("Main", function() { @@ -115,6 +118,49 @@ describe("QiDao", function() { ); }); + + it("should create a LINK vault in QiDao and deposit LINK into that vault", async function() { + const amt = parseEther("50"); + const brwAmt = parseEther("10"); + const setVaultId = "13571113"; + const spells = [ + { + connector: connectorName, + method: "createVault", + args: [vaults.link.address, setVaultId], + }, + { + connector: connectorName, + method: "deposit", + args: [polygonTokens.link.address, vaults.link.address, 0, amt, setVaultId, 0, 0, 0], + }, + { + connector: connectorName, + method: "borrow", + args: [vaults.link.address, 0, brwAmt, setVaultId, 0, 0 , 0] + }, + { + connector: connectorName, + method: "payback", + args: [vaults.link.address, 0, brwAmt, setVaultId, 0, 0 , 0], + }, + { + connector: connectorName, + method: "withdraw", + args: [polygonTokens.link.address, vaults.link.address, 0, amt.mul(995).div(1000), setVaultId, 0, 0, 0], + }, + ]; + + const tx = await dsaWallet0 + .connect(wallet0) + .cast(...encodeSpells(spells), wallet1.address); + + await tx.wait(); + + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.eq( + parseEther("9.975") + ); + }); // it("Should borrow and payback half DAI from Aave V2", async function() { // const amt = parseEther("100"); // 100 DAI // // const setId = "83478237";