Functional link deposit, borrow, payback, and withdraw

This commit is contained in:
Mark Aiken 2021-11-20 14:18:15 -08:00
parent c4421a60f8
commit 0fca7d7d00
5 changed files with 100 additions and 31 deletions

View File

@ -153,7 +153,6 @@ abstract contract QiDaoResolver is Events, Helpers {
erc20StablecoinInterface vault = erc20StablecoinInterface(vaultAddress); erc20StablecoinInterface vault = erc20StablecoinInterface(vaultAddress);
vault.borrowToken(_vaultId, _amt); vault.borrowToken(_vaultId, _amt);
vault.transferVault(_vaultId, address(this));
setUint(setAmtId, _amt); setUint(setAmtId, _amt);
setUint(getVaultId, _vaultId); setUint(getVaultId, _vaultId);

View File

@ -6,4 +6,11 @@ module.exports = {
"address": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "address": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"decimals": 18 "decimals": 18
}, },
"link": {
"type": "token",
"symbol": "LINK",
"name": "ChainLink Token",
"address": "0x53e0bca35ec356bd5dddfebbd1fc0fd03fabad39",
"decimals": 18
},
} }

View File

@ -1,5 +1,8 @@
module.exports = { module.exports = {
matic: { matic: {
address: "0xa3fa99a148fa48d14ed51d610c367c61876997f1" address: "0xa3fa99a148fa48d14ed51d610c367c61876997f1"
},
link: {
address: "0x61167073E31b1DAd85a3E531211c7B8F1E5cAE72"
} }
} }

View File

@ -8,14 +8,15 @@ const mineTx = async (tx: any) => {
}; };
const tokenMapping: Record<string, any> = { const tokenMapping: Record<string, any> = {
usdc: { eth:{
impersonateSigner: "0xfcb19e6a322b27c06842a71e8c725399f049ae3a", usdc: {
address: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", impersonateSigner: "0xfcb19e6a322b27c06842a71e8c725399f049ae3a",
abi: [ address: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"function mint(address _to, uint256 _amount) external returns (bool);", 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); 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)); await mineTx(contract.mint(to, amt));
}, },
@ -39,40 +40,53 @@ const tokenMapping: Record<string, any> = {
process: async function(owner: Signer | Provider, address: any, amt: any) { process: async function(owner: Signer | Provider, address: any, amt: any) {
const contract = new ethers.Contract(this.address, this.abi, owner); const contract = new ethers.Contract(this.address, this.abi, owner);
await mineTx(contract.issue(amt)); await mineTx(contract.issue(amt));
await mineTx(contract.transfer(address, amt)); await mineTx(contract.transfer(address, amt));
},
}, },
}, wbtc: {
wbtc: { impersonateSigner: "0xCA06411bd7a7296d7dbdd0050DFc846E95fEBEB7",
impersonateSigner: "0xCA06411bd7a7296d7dbdd0050DFc846E95fEBEB7", address: "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",
address: "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", abi: ["function mint(address _to, uint256 _amount) public returns (bool)"],
abi: ["function mint(address _to, uint256 _amount) public returns (bool)"], process: async function(owner: Signer | Provider, address: any, amt: any) {
process: async function(owner: Signer | Provider, address: any, amt: any) { const contract = new ethers.Contract(this.address, this.abi, owner);
const contract = new ethers.Contract(this.address, this.abi, owner); await mineTx(contract.mint(address, amt));
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));
}, },
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 [signer] = await ethers.getSigners();
const _chain = chain ? chain : 'eth';
tokenName = tokenName.toLowerCase(); tokenName = tokenName.toLowerCase();
if (!tokenMapping[tokenName]) { if (!tokenMapping[_chain][tokenName]) {
throw new Error( throw new Error(
`Add liquidity doesn't support the following token: ${tokenName}` `Add liquidity doesn't support the following token: ${tokenName}`
); );
} }
const token = tokenMapping[tokenName]; const token = tokenMapping[_chain][tokenName];
const [impersonatedSigner] = await impersonateAccounts([ const [impersonatedSigner] = await impersonateAccounts([
token.impersonateSigner, token.impersonateSigner,

View File

@ -69,6 +69,9 @@ describe("QiDao", function() {
parseEther("10") parseEther("10")
); );
}); });
it("Deposit LINK into DSA wallet", async function() {
await addLiquidity("link", dsaWallet0.address, parseEther("100"), "polygon")
})
}); });
describe("Main", function() { 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() { // it("Should borrow and payback half DAI from Aave V2", async function() {
// const amt = parseEther("100"); // 100 DAI // const amt = parseEther("100"); // 100 DAI
// // const setId = "83478237"; // // const setId = "83478237";