mirror of
				https://github.com/Instadapp/dsa-connectors.git
				synced 2024-07-29 22:37:00 +00:00 
			
		
		
		
	Merge branch 'main' into feat/refinance-connector
This commit is contained in:
		
						commit
						674e1ec4df
					
				
							
								
								
									
										6
									
								
								contracts/mainnet/connectors/INST/events.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								contracts/mainnet/connectors/INST/events.sol
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
pragma solidity ^0.7.0;
 | 
			
		||||
 | 
			
		||||
contract Events {
 | 
			
		||||
    event LogVoteCast(uint256 proposalId, uint256 support, string reason);
 | 
			
		||||
    event LogDelegate(address delegatee);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								contracts/mainnet/connectors/INST/helpers.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								contracts/mainnet/connectors/INST/helpers.sol
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,18 @@
 | 
			
		|||
pragma solidity ^0.7.0;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
import { DSMath } from "../../common/math.sol";
 | 
			
		||||
import { Basic } from "../../common/basic.sol";
 | 
			
		||||
import { InstaTokenInterface, InstaGovernorInterface } from "./interface.sol";
 | 
			
		||||
 | 
			
		||||
abstract contract Helpers is DSMath, Basic {
 | 
			
		||||
    /**
 | 
			
		||||
     * @dev InstaGovernorBravo
 | 
			
		||||
     */
 | 
			
		||||
    InstaGovernorInterface internal constant instaGovernor = InstaGovernorInterface(0x0204Cd037B2ec03605CFdFe482D8e257C765fA1B);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @dev INST Token
 | 
			
		||||
     */
 | 
			
		||||
    InstaTokenInterface internal constant instToken = InstaTokenInterface(0x6f40d4A6237C257fff2dB00FA0510DeEECd303eb);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								contracts/mainnet/connectors/INST/interface.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								contracts/mainnet/connectors/INST/interface.sol
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
pragma solidity ^0.7.0;
 | 
			
		||||
 | 
			
		||||
interface InstaGovernorInterface {
 | 
			
		||||
    function castVoteWithReason(uint proposalId, uint8 support, string calldata reason) external;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface InstaTokenInterface {
 | 
			
		||||
    function delegate(address delegatee) external;
 | 
			
		||||
    function delegates(address) external view returns(address);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										60
									
								
								contracts/mainnet/connectors/INST/main.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								contracts/mainnet/connectors/INST/main.sol
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,60 @@
 | 
			
		|||
pragma solidity ^0.7.0;
 | 
			
		||||
pragma experimental ABIEncoderV2;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @title Instadapp Governance.
 | 
			
		||||
 * @dev Governance.
 | 
			
		||||
 */
 | 
			
		||||
import { TokenInterface } from "../../common/interfaces.sol";
 | 
			
		||||
import { Stores } from "../../common/stores.sol";
 | 
			
		||||
import { Helpers } from "./helpers.sol";
 | 
			
		||||
import { Events } from "./events.sol";
 | 
			
		||||
 | 
			
		||||
abstract contract Resolver is Events, Helpers {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @dev Delegate votes.
 | 
			
		||||
     * @notice Delegating votes to delegatee.
 | 
			
		||||
     * @param delegatee The address to delegate the votes.
 | 
			
		||||
    */
 | 
			
		||||
    function delegate(address delegatee) external payable returns (string memory _eventName, bytes memory _eventParam) {
 | 
			
		||||
        require(instToken.delegates(address(this)) != delegatee, "Already delegated to same delegatee.");
 | 
			
		||||
 | 
			
		||||
        instToken.delegate(delegatee);
 | 
			
		||||
 | 
			
		||||
        _eventName = "LogDelegate(address)";
 | 
			
		||||
        _eventParam = abi.encode(delegatee);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @dev Cast vote.
 | 
			
		||||
      * @notice Casting vote for a proposal
 | 
			
		||||
      * @param proposalId The id of the proposal to vote on
 | 
			
		||||
      * @param support The support value for the vote. 0=against, 1=for, 2=abstain
 | 
			
		||||
    */
 | 
			
		||||
    function voteCast(uint256 proposalId, uint256 support) external payable returns (string memory _eventName, bytes memory _eventParam) {
 | 
			
		||||
        instaGovernor.castVoteWithReason(proposalId, uint8(support), "");
 | 
			
		||||
 | 
			
		||||
        _eventName = "LogVoteCast(uint256,uint256,string)";
 | 
			
		||||
        _eventParam = abi.encode(proposalId, support, "");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @dev Cast vote with reason.
 | 
			
		||||
      * @notice Casting vote for a proposal
 | 
			
		||||
      * @param proposalId The id of the proposal to vote on
 | 
			
		||||
      * @param support The support value for the vote. 0=against, 1=for, 2=abstain
 | 
			
		||||
      * @param reason The reason given for the vote
 | 
			
		||||
    */
 | 
			
		||||
    function voteCastWithReason(uint256 proposalId, uint256 support, string calldata reason) external payable returns (string memory _eventName, bytes memory _eventParam) {
 | 
			
		||||
        instaGovernor.castVoteWithReason(proposalId, uint8(support), reason);
 | 
			
		||||
 | 
			
		||||
        _eventName = "LogVoteCast(uint256,uint256,string)";
 | 
			
		||||
        _eventParam = abi.encode(proposalId, support, reason);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
contract ConnectV2InstadappGovernanceBravo is Resolver {
 | 
			
		||||
    string public constant name = "Instadapp-governance-bravo-v1";
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -21,6 +21,7 @@
 | 
			
		|||
    "MAKERDAO-CLAIM-A": "0x2f8cBE650af98602a215b6482F2aD60893C5A4E8",
 | 
			
		||||
    "WETH-A": "0x22075fa719eFb02Ca3cF298AFa9C974B7465E5D3",
 | 
			
		||||
    "REFINANCE-A": "0x9eA34bE6dA51aa9F6408FeA79c946FDCFA424442"
 | 
			
		||||
    "INST-A": "0x52C2C4a0db049255fF345EB9D3Fb1f555b7a924A"
 | 
			
		||||
  },
 | 
			
		||||
  "137" : {
 | 
			
		||||
    "AAVE-V2-A": "0xE84d8010Afc3663919F44685cB53ED88866da3eE",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ module.exports = {
 | 
			
		|||
    hardhat: {
 | 
			
		||||
      forking: {
 | 
			
		||||
        url: `https://eth-mainnet.alchemyapi.io/v2/${ALCHEMY_ID}`,
 | 
			
		||||
        blockNumber: 12433781,
 | 
			
		||||
        blockNumber: 12696000,
 | 
			
		||||
      },
 | 
			
		||||
      blockGasLimit: 12000000,
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1
									
								
								scripts/constant/abi/connectors/instapool.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								scripts/constant/abi/connectors/instapool.json
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
[{"type":"event","name":"LogFlashBorrow","inputs":[{"type":"address","name":"token","internalType":"address","indexed":false},{"type":"uint256","name":"tokenAmt","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LogFlashMultiBorrow","inputs":[{"type":"address[]","name":"token","internalType":"address[]","indexed":false},{"type":"uint256[]","name":"tokenAmts","internalType":"uint256[]","indexed":false}],"anonymous":false},{"type":"event","name":"LogFlashMultiPayback","inputs":[{"type":"address[]","name":"token","internalType":"address[]","indexed":false},{"type":"uint256[]","name":"tokenAmts","internalType":"uint256[]","indexed":false}],"anonymous":false},{"type":"event","name":"LogFlashPayback","inputs":[{"type":"address","name":"token","internalType":"address","indexed":false},{"type":"uint256","name":"tokenAmt","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"payable","outputs":[{"type":"string","name":"_eventName","internalType":"string"},{"type":"bytes","name":"_eventParam","internalType":"bytes"}],"name":"flashBorrowAndCast","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"amt","internalType":"uint256"},{"type":"uint256","name":"route","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"string","name":"_eventName","internalType":"string"},{"type":"bytes","name":"_eventParam","internalType":"bytes"}],"name":"flashMultiBorrowAndCast","inputs":[{"type":"address[]","name":"tokens","internalType":"address[]"},{"type":"uint256[]","name":"amts","internalType":"uint256[]"},{"type":"uint256","name":"route","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"string","name":"_eventName","internalType":"string"},{"type":"bytes","name":"_eventParam","internalType":"bytes"}],"name":"flashMultiPayback","inputs":[{"type":"address[]","name":"tokens","internalType":"address[]"},{"type":"uint256[]","name":"amts","internalType":"uint256[]"},{"type":"uint256[]","name":"getId","internalType":"uint256[]"},{"type":"uint256[]","name":"setId","internalType":"uint256[]"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"string","name":"_eventName","internalType":"string"},{"type":"bytes","name":"_eventParam","internalType":"bytes"}],"name":"flashPayback","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"amt","internalType":"uint256"},{"type":"uint256","name":"getId","internalType":"uint256"},{"type":"uint256","name":"setId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract InstaFlashV2Interface"}],"name":"instaPool","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]}]
 | 
			
		||||
| 
						 | 
				
			
			@ -6,6 +6,7 @@ module.exports = {
 | 
			
		|||
    connectors: {
 | 
			
		||||
      basic: require("./abi/connectors/basic.json"),
 | 
			
		||||
      auth: require("./abi/connectors/auth.json"),
 | 
			
		||||
      "INSTAPOOL-A": require("./abi/connectors/instapool.json"),
 | 
			
		||||
    },
 | 
			
		||||
    basic: {
 | 
			
		||||
      erc20: require("./abi/basics/erc20.json"),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,10 +2,11 @@ module.exports = {
 | 
			
		|||
    connectors: {
 | 
			
		||||
      basic: "0xe5398f279175962E56fE4c5E0b62dc7208EF36c6",
 | 
			
		||||
      auth: "0xd1aff9f2acf800c876c409100d6f39aea93fc3d9",
 | 
			
		||||
      "INSTAPOOL-A": "0x5806af7ab22e2916fa582ff05731bf7c682387b2"
 | 
			
		||||
    },
 | 
			
		||||
    core: {
 | 
			
		||||
      connectorsV2: "0xFE2390DAD597594439f218190fC2De40f9Cf1179",
 | 
			
		||||
      instaIndex: "0x2971AdFa57b20E5a416aE5a708A8655A9c74f723"
 | 
			
		||||
      connectorsV2: "0x97b0B3A8bDeFE8cB9563a3c610019Ad10DB8aD11",
 | 
			
		||||
      instaIndex: "0x2971AdFa57b20E5a416aE5a708A8655A9c74f723",
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
  
 | 
			
		||||
							
								
								
									
										16
									
								
								scripts/encodeFlashcastData.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								scripts/encodeFlashcastData.js
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
const abis = require("./constant/abis");
 | 
			
		||||
const addresses = require("./constant/addresses");
 | 
			
		||||
const { web3 } = hre;
 | 
			
		||||
 | 
			
		||||
const encodeSpells = require("./encodeSpells.js")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
module.exports = function (spells) {
 | 
			
		||||
    const encodeSpellsData = encodeSpells(spells);
 | 
			
		||||
    const targetType = "string[]";
 | 
			
		||||
    let argTypes = [targetType, "bytes[]"];
 | 
			
		||||
    return web3.eth.abi.encodeParameters(argTypes, [
 | 
			
		||||
        encodeSpellsData[0],
 | 
			
		||||
        encodeSpellsData[1],
 | 
			
		||||
    ]);
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										109
									
								
								test/instapool/instapool.test.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								test/instapool/instapool.test.js
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,109 @@
 | 
			
		|||
const { expect } = require("chai");
 | 
			
		||||
const hre = require("hardhat");
 | 
			
		||||
const { web3, deployments, waffle, ethers } = hre;
 | 
			
		||||
const { provider, deployContract } = waffle
 | 
			
		||||
 | 
			
		||||
const deployAndEnableConnector = require("../../scripts/deployAndEnableConnector.js")
 | 
			
		||||
const buildDSAv2 = require("../../scripts/buildDSAv2")
 | 
			
		||||
const encodeSpells = require("../../scripts/encodeSpells.js")
 | 
			
		||||
const encodeFlashcastData = require("../../scripts/encodeFlashcastData.js")
 | 
			
		||||
const getMasterSigner = require("../../scripts/getMasterSigner")
 | 
			
		||||
 | 
			
		||||
const addresses = require("../../scripts/constant/addresses");
 | 
			
		||||
const abis = require("../../scripts/constant/abis");
 | 
			
		||||
const constants = require("../../scripts/constant/constant");
 | 
			
		||||
const tokens = require("../../scripts/constant/tokens");
 | 
			
		||||
 | 
			
		||||
const connectV2CompoundArtifacts = require("../../artifacts/contracts/mainnet/connectors/compound/main.sol/ConnectV2Compound.json")
 | 
			
		||||
 | 
			
		||||
describe("Instapool", function () {
 | 
			
		||||
    const connectorName = "COMPOUND-TEST-A"
 | 
			
		||||
    
 | 
			
		||||
    let dsaWallet0
 | 
			
		||||
    let masterSigner;
 | 
			
		||||
    let instaConnectorsV2;
 | 
			
		||||
    let connector;
 | 
			
		||||
    
 | 
			
		||||
    const wallets = provider.getWallets()
 | 
			
		||||
    const [wallet0, wallet1, wallet2, wallet3] = wallets
 | 
			
		||||
    before(async () => {
 | 
			
		||||
        masterSigner = await getMasterSigner(wallet3)
 | 
			
		||||
        instaConnectorsV2 = await ethers.getContractAt(abis.core.connectorsV2, addresses.core.connectorsV2);
 | 
			
		||||
        connector = await deployAndEnableConnector({
 | 
			
		||||
            connectorName,
 | 
			
		||||
            contractArtifact: connectV2CompoundArtifacts,
 | 
			
		||||
            signer: masterSigner,
 | 
			
		||||
            connectors: instaConnectorsV2
 | 
			
		||||
        })
 | 
			
		||||
        console.log("Connector address", connector.address)
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  it("Should have contracts deployed.", async function () {
 | 
			
		||||
    expect(!!instaConnectorsV2.address).to.be.true;
 | 
			
		||||
    expect(!!connector.address).to.be.true;
 | 
			
		||||
    expect(!!masterSigner.address).to.be.true;
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  describe("DSA wallet setup", function () {
 | 
			
		||||
    it("Should build DSA v2", async function () {
 | 
			
		||||
        dsaWallet0 = await buildDSAv2(wallet0.address)
 | 
			
		||||
        expect(!!dsaWallet0.address).to.be.true;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it("Deposit ETH into DSA wallet", async function () {
 | 
			
		||||
        await wallet0.sendTransaction({
 | 
			
		||||
            to: dsaWallet0.address,
 | 
			
		||||
            value: ethers.utils.parseEther("10")
 | 
			
		||||
        });
 | 
			
		||||
        expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("10"));
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  describe("Main", function () {
 | 
			
		||||
 | 
			
		||||
    it("Should deposit ETH in Compound", async function () {
 | 
			
		||||
        const amount = ethers.utils.parseEther("1") // 1 ETH
 | 
			
		||||
        const flashloanAmount = ethers.utils.parseEther("100") // 100 ETH
 | 
			
		||||
        const ethAddress = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"
 | 
			
		||||
 | 
			
		||||
        const IdOne = "2878734423"
 | 
			
		||||
        const IdTwo = "783243246"
 | 
			
		||||
 | 
			
		||||
        const spells = [
 | 
			
		||||
            {
 | 
			
		||||
                connector: connectorName,
 | 
			
		||||
                method: "deposit",
 | 
			
		||||
                args: ["ETH-A", flashloanAmount, 0, IdOne]
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                connector: connectorName,
 | 
			
		||||
                method: "withdraw",
 | 
			
		||||
                args: ["ETH-A", amount, IdOne, IdTwo]
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                connector: "INSTAPOOL-A",
 | 
			
		||||
                method: "flashPayback",
 | 
			
		||||
                args: [ethAddress, flashloanAmount, IdTwo, 0],
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
        const calldata = encodeFlashcastData(spells);
 | 
			
		||||
 | 
			
		||||
        const spells2 = [
 | 
			
		||||
            {
 | 
			
		||||
              connector: "INSTAPOOL-A",
 | 
			
		||||
              method: "flashBorrowAndCast",
 | 
			
		||||
              args: [
 | 
			
		||||
                "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
 | 
			
		||||
                flashloanAmount,
 | 
			
		||||
                0, // route
 | 
			
		||||
                calldata,
 | 
			
		||||
              ],
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
        const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells2), wallet1.address)
 | 
			
		||||
        const receipt = await tx.wait()
 | 
			
		||||
    });
 | 
			
		||||
  })
 | 
			
		||||
})
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user