mirror of
https://github.com/Instadapp/dsa-connectors.git
synced 2024-07-29 22:37:00 +00:00
feat/implement sushiswap double incentive
This commit is contained in:
parent
102be3a91c
commit
650009f45e
|
@ -8,6 +8,7 @@ interface TokenInterface {
|
||||||
function withdraw(uint) external;
|
function withdraw(uint) external;
|
||||||
function balanceOf(address) external view returns (uint);
|
function balanceOf(address) external view returns (uint);
|
||||||
function decimals() external view returns (uint);
|
function decimals() external view returns (uint);
|
||||||
|
function totalSupply() external view returns (uint);
|
||||||
}
|
}
|
||||||
|
|
||||||
interface MemoryInterface {
|
interface MemoryInterface {
|
||||||
|
|
36
contracts/mainnet/connectors/sushi-incentive/events.sol
Normal file
36
contracts/mainnet/connectors/sushi-incentive/events.sol
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
pragma solidity ^0.7.0;
|
||||||
|
|
||||||
|
contract Events {
|
||||||
|
event LogDeposit(
|
||||||
|
address indexed user,
|
||||||
|
uint256 indexed pid,
|
||||||
|
uint256 indexed version,
|
||||||
|
uint256 amount
|
||||||
|
);
|
||||||
|
event LogWithdraw(
|
||||||
|
address indexed user,
|
||||||
|
uint256 indexed pid,
|
||||||
|
uint256 indexed version,
|
||||||
|
uint256 amount
|
||||||
|
);
|
||||||
|
event LogEmergencyWithdraw(
|
||||||
|
address indexed user,
|
||||||
|
uint256 indexed pid,
|
||||||
|
uint256 indexed version,
|
||||||
|
uint256 lpAmount,
|
||||||
|
uint256 rewardsAmount
|
||||||
|
);
|
||||||
|
event LogHarvest(
|
||||||
|
address indexed user,
|
||||||
|
uint256 indexed pid,
|
||||||
|
uint256 indexed version,
|
||||||
|
uint256 amount
|
||||||
|
);
|
||||||
|
event LogWithdrawAndHarvest(
|
||||||
|
address indexed user,
|
||||||
|
uint256 indexed pid,
|
||||||
|
uint256 indexed version,
|
||||||
|
uint256 widrawAmount,
|
||||||
|
uint256 harvestAmount
|
||||||
|
);
|
||||||
|
}
|
88
contracts/mainnet/connectors/sushi-incentive/helpers.sol
Normal file
88
contracts/mainnet/connectors/sushi-incentive/helpers.sol
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
pragma solidity ^0.7.0;
|
||||||
|
pragma experimental ABIEncoderV2;
|
||||||
|
|
||||||
|
import {DSMath} from "../../common/math.sol";
|
||||||
|
import {Basic} from "../../common/basic.sol";
|
||||||
|
import "./interface.sol";
|
||||||
|
|
||||||
|
contract Helpers is DSMath, Basic {
|
||||||
|
IMasterChefV2 immutable masterChefV2 =
|
||||||
|
IMasterChefV2(0xEF0881eC094552b2e128Cf945EF17a6752B4Ec5d);
|
||||||
|
IMasterChef immutable masterChef =
|
||||||
|
IMasterChef(0xc2EdaD668740f1aA35E4D8f227fB8E17dcA888Cd);
|
||||||
|
ISushiSwapFactory immutable factory =
|
||||||
|
ISushiSwapFactory(0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac);
|
||||||
|
|
||||||
|
function _deposit(uint256 _pid, uint256 _amount, uint256 _version) internal {
|
||||||
|
if(_version == 2)
|
||||||
|
masterChefV2.deposit(_pid, _amount, address(this));
|
||||||
|
else
|
||||||
|
masterChef.deposit(_pid, _amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _withdraw(uint256 _pid, uint256 _amount, uint256 _version) internal {
|
||||||
|
if(_version == 2)
|
||||||
|
masterChefV2.withdraw(_pid, _amount, address(this));
|
||||||
|
else
|
||||||
|
masterChef.withdraw(_pid, _amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _harvest(uint256 _pid) internal {
|
||||||
|
masterChefV2.harvest(_pid, address(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
function _withdrawAndHarvest(uint256 _pid, uint256 _amount, uint256 _version) internal {
|
||||||
|
if(_version == 2)
|
||||||
|
masterChefV2.withdrawAndHarvest(_pid, _amount, address(this));
|
||||||
|
else _withdraw(_pid, _amount, _version);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _emergencyWithdraw(uint256 _pid, uint256 _version) internal {
|
||||||
|
if(_version == 2)
|
||||||
|
masterChefV2.emergencyWithdraw(_pid, address(this));
|
||||||
|
else
|
||||||
|
masterChef.emergencyWithdraw(_pid, address(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
function _getPoolId(address tokenA, address tokenB)
|
||||||
|
internal
|
||||||
|
view
|
||||||
|
returns (uint256 poolId, uint256 version, address lpToken)
|
||||||
|
{
|
||||||
|
address pair = factory.getPair(tokenA, tokenB);
|
||||||
|
uint256 length = masterChefV2.poolLength();
|
||||||
|
version = 2;
|
||||||
|
poolId = uint256(-1);
|
||||||
|
|
||||||
|
for (uint256 i = 0; i < length; i++) {
|
||||||
|
lpToken = masterChefV2.lpToken(i);
|
||||||
|
if (pair == lpToken) {
|
||||||
|
poolId = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint256 lengthV1 = masterChef.poolLength();
|
||||||
|
for (uint256 i = 0; i < lengthV1; i++) {
|
||||||
|
(lpToken, , , ) = masterChef.poolInfo(i);
|
||||||
|
if (pair == lpToken) {
|
||||||
|
poolId = i;
|
||||||
|
version = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function _getUserInfo(uint256 _pid, uint256 _version)
|
||||||
|
internal
|
||||||
|
view
|
||||||
|
returns (uint256 lpAmount, uint256 rewardsAmount)
|
||||||
|
{
|
||||||
|
if(_version == 2)
|
||||||
|
(lpAmount, rewardsAmount) = masterChefV2.userInfo(_pid, address(this));
|
||||||
|
else
|
||||||
|
(lpAmount, rewardsAmount) = masterChef.userInfo(_pid, address(this));
|
||||||
|
}
|
||||||
|
}
|
94
contracts/mainnet/connectors/sushi-incentive/interface.sol
Normal file
94
contracts/mainnet/connectors/sushi-incentive/interface.sol
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
pragma solidity ^0.7.0;
|
||||||
|
pragma experimental ABIEncoderV2;
|
||||||
|
import "./libraries/IERC20.sol";
|
||||||
|
|
||||||
|
struct UserInfo {
|
||||||
|
uint256 amount;
|
||||||
|
uint256 rewardDebt;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct PoolInfo {
|
||||||
|
IERC20 lpToken; // Address of LP token contract.
|
||||||
|
uint256 allocPoint; // How many allocation points assigned to this pool. SUSHIs to distribute per block.
|
||||||
|
uint256 lastRewardBlock; // Last block number that SUSHIs distribution occurs.
|
||||||
|
uint256 accSushiPerShare; // Accumulated SUSHIs per share, times 1e12. See below.
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IMasterChef {
|
||||||
|
function poolLength() external view returns (uint256);
|
||||||
|
|
||||||
|
function updatePool(uint256 pid) external returns (PoolInfo memory);
|
||||||
|
|
||||||
|
function poolInfo(uint256 pid) external view returns (address, uint256, uint256, uint256);
|
||||||
|
|
||||||
|
function userInfo(uint256 _pid, address _user)
|
||||||
|
external
|
||||||
|
view
|
||||||
|
returns (uint256, uint256);
|
||||||
|
|
||||||
|
function deposit(
|
||||||
|
uint256 pid,
|
||||||
|
uint256 amount
|
||||||
|
) external;
|
||||||
|
|
||||||
|
function withdraw(
|
||||||
|
uint256 pid,
|
||||||
|
uint256 amount
|
||||||
|
) external;
|
||||||
|
|
||||||
|
function emergencyWithdraw(uint256 pid, address to) external;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IMasterChefV2 {
|
||||||
|
function poolLength() external view returns (uint256);
|
||||||
|
|
||||||
|
function updatePool(uint256 pid) external returns (PoolInfo memory);
|
||||||
|
|
||||||
|
function lpToken(uint256 pid) external view returns (address);
|
||||||
|
|
||||||
|
function userInfo(uint256 _pid, address _user)
|
||||||
|
external
|
||||||
|
view
|
||||||
|
returns (uint256, uint256);
|
||||||
|
|
||||||
|
function deposit(
|
||||||
|
uint256 pid,
|
||||||
|
uint256 amount,
|
||||||
|
address to
|
||||||
|
) external;
|
||||||
|
|
||||||
|
function withdraw(
|
||||||
|
uint256 pid,
|
||||||
|
uint256 amount,
|
||||||
|
address to
|
||||||
|
) external;
|
||||||
|
|
||||||
|
function emergencyWithdraw(uint256 pid, address to) external;
|
||||||
|
|
||||||
|
function harvest(uint256 pid, address to) external;
|
||||||
|
|
||||||
|
function withdrawAndHarvest(
|
||||||
|
uint256 pid,
|
||||||
|
uint256 amount,
|
||||||
|
address to
|
||||||
|
) external;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ISushiSwapFactory {
|
||||||
|
function getPair(address tokenA, address tokenB)
|
||||||
|
external
|
||||||
|
view
|
||||||
|
returns (address pair);
|
||||||
|
|
||||||
|
function allPairs(uint256) external view returns (address pair);
|
||||||
|
|
||||||
|
function allPairsLength() external view returns (uint256);
|
||||||
|
|
||||||
|
function feeTo() external view returns (address);
|
||||||
|
|
||||||
|
function feeToSetter() external view returns (address);
|
||||||
|
|
||||||
|
function createPair(address tokenA, address tokenB)
|
||||||
|
external
|
||||||
|
returns (address pair);
|
||||||
|
}
|
146
contracts/mainnet/connectors/sushi-incentive/main.sol
Normal file
146
contracts/mainnet/connectors/sushi-incentive/main.sol
Normal file
|
@ -0,0 +1,146 @@
|
||||||
|
pragma solidity ^0.7.0;
|
||||||
|
pragma experimental ABIEncoderV2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @title SushiSwap Double Incentive.
|
||||||
|
* @dev Decentralized Exchange.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {TokenInterface} from "../../common/interfaces.sol";
|
||||||
|
import {Helpers} from "./helpers.sol";
|
||||||
|
import {Events} from "./events.sol";
|
||||||
|
|
||||||
|
abstract contract SushipswapIncentiveResolver is Helpers, Events {
|
||||||
|
/**
|
||||||
|
* @dev deposit LP token to masterChef
|
||||||
|
* @param token1 token1 of LP token
|
||||||
|
* @param token2 token2 of LP token
|
||||||
|
* @param amount amount of LP token
|
||||||
|
* @param getId ID to retrieve amount
|
||||||
|
* @param setId ID stores Pool ID
|
||||||
|
*/
|
||||||
|
function deposit(
|
||||||
|
address token1,
|
||||||
|
address token2,
|
||||||
|
uint256 amount,
|
||||||
|
uint256 getId,
|
||||||
|
uint256 setId
|
||||||
|
) external {
|
||||||
|
amount = getUint(getId, amount);
|
||||||
|
(uint256 _pid, uint256 _version, address lpTokenAddr) = _getPoolId(
|
||||||
|
token1,
|
||||||
|
token2
|
||||||
|
);
|
||||||
|
setUint(setId, _pid);
|
||||||
|
require(_pid != uint256(-1), "pool-does-not-exist");
|
||||||
|
TokenInterface lpToken = TokenInterface(lpTokenAddr);
|
||||||
|
lpToken.approve(address(masterChef), amount);
|
||||||
|
_deposit(_pid, amount, _version);
|
||||||
|
emit LogDeposit(address(this), _pid, _version, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev withdraw LP token from masterChef
|
||||||
|
* @param token1 token1 of LP token
|
||||||
|
* @param token2 token2 of LP token
|
||||||
|
* @param amount amount of LP token
|
||||||
|
* @param getId ID to retrieve amount
|
||||||
|
* @param setId ID stores Pool ID
|
||||||
|
*/
|
||||||
|
function withdraw(
|
||||||
|
address token1,
|
||||||
|
address token2,
|
||||||
|
uint256 amount,
|
||||||
|
uint256 getId,
|
||||||
|
uint256 setId
|
||||||
|
) external {
|
||||||
|
amount = getUint(getId, amount);
|
||||||
|
(uint256 _pid, uint256 _version, ) = _getPoolId(token1, token2);
|
||||||
|
setUint(setId, _pid);
|
||||||
|
require(_pid != uint256(-1), "pool-does-not-exist");
|
||||||
|
_withdraw(_pid, amount, _version);
|
||||||
|
emit LogWithdraw(address(this), _pid, _version, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev harvest from masterChef
|
||||||
|
* @param token1 token1 deposited of LP token
|
||||||
|
* @param token2 token2 deposited LP token
|
||||||
|
* @param setId ID stores Pool ID
|
||||||
|
*/
|
||||||
|
function harvest(
|
||||||
|
address token1,
|
||||||
|
address token2,
|
||||||
|
uint256 setId
|
||||||
|
) external {
|
||||||
|
(uint256 _pid, uint256 _version, ) = _getPoolId(token1, token2);
|
||||||
|
setUint(setId, _pid);
|
||||||
|
require(_pid != uint256(-1), "pool-does-not-exist");
|
||||||
|
(, uint256 rewardsAmount) = _getUserInfo(_pid, _version);
|
||||||
|
if (_version == 2) _harvest(_pid);
|
||||||
|
else _withdraw(_pid, 0, _version);
|
||||||
|
emit LogHarvest(address(this), _pid, _version, rewardsAmount);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev withdraw LP token and harvest from masterChef
|
||||||
|
* @param token1 token1 of LP token
|
||||||
|
* @param token2 token2 of LP token
|
||||||
|
* @param amount amount of LP token
|
||||||
|
* @param getId ID to retrieve amount
|
||||||
|
* @param setId ID stores Pool ID
|
||||||
|
*/
|
||||||
|
function withdrawAndHarvest(
|
||||||
|
address token1,
|
||||||
|
address token2,
|
||||||
|
uint256 amount,
|
||||||
|
uint256 getId,
|
||||||
|
uint256 setId
|
||||||
|
) external {
|
||||||
|
amount = getUint(getId, amount);
|
||||||
|
(uint256 _pid, uint256 _version, ) = _getPoolId(token1, token2);
|
||||||
|
setUint(setId, _pid);
|
||||||
|
require(_pid != uint256(-1), "pool-does-not-exist");
|
||||||
|
(, uint256 rewardsAmount) = _getUserInfo(_pid, _version);
|
||||||
|
_withdrawAndHarvest(_pid, amount, _version);
|
||||||
|
emit LogWithdrawAndHarvest(
|
||||||
|
address(this),
|
||||||
|
_pid,
|
||||||
|
_version,
|
||||||
|
amount,
|
||||||
|
rewardsAmount
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dev emergency withdraw from masterChef
|
||||||
|
* @param token1 token1 deposited of LP token
|
||||||
|
* @param token2 token2 deposited LP token
|
||||||
|
* @param setId ID stores Pool ID
|
||||||
|
*/
|
||||||
|
function emergencyWithdraw(
|
||||||
|
address token1,
|
||||||
|
address token2,
|
||||||
|
uint256 setId
|
||||||
|
) external {
|
||||||
|
(uint256 _pid, uint256 _version, ) = _getPoolId(token1, token2);
|
||||||
|
setUint(setId, _pid);
|
||||||
|
require(_pid != uint256(-1), "pool-does-not-exist");
|
||||||
|
(uint256 lpAmount, uint256 rewardsAmount) = _getUserInfo(
|
||||||
|
_pid,
|
||||||
|
_version
|
||||||
|
);
|
||||||
|
_emergencyWithdraw(_pid, _version);
|
||||||
|
emit LogEmergencyWithdraw(
|
||||||
|
address(this),
|
||||||
|
_pid,
|
||||||
|
_version,
|
||||||
|
lpAmount,
|
||||||
|
rewardsAmount
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
contract ConnectV2SushiswapIncentive is SushipswapIncentiveResolver {
|
||||||
|
string public constant name = "SushipswapIncentive-v1.1";
|
||||||
|
}
|
90
hardhat.config.js
Normal file
90
hardhat.config.js
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
require("@nomiclabs/hardhat-waffle");
|
||||||
|
require("@nomiclabs/hardhat-ethers");
|
||||||
|
require("@tenderly/hardhat-tenderly");
|
||||||
|
require("@nomiclabs/hardhat-etherscan");
|
||||||
|
require("@nomiclabs/hardhat-web3");
|
||||||
|
require("hardhat-deploy");
|
||||||
|
require("hardhat-deploy-ethers");
|
||||||
|
require("dotenv").config();
|
||||||
|
|
||||||
|
const { utils } = require("ethers");
|
||||||
|
|
||||||
|
const PRIVATE_KEY = process.env.PRIVATE_KEY;
|
||||||
|
const ALCHEMY_ID = process.env.ALCHEMY_ID;
|
||||||
|
const ETHERSCAN_API_KEY = process.env.ETHERSCAN_API_KEY;
|
||||||
|
|
||||||
|
if (!process.env.ALCHEMY_ID) {
|
||||||
|
throw new Error("ENV Variable ALCHEMY_ID not set!");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type import('hardhat/config').HardhatUserConfig
|
||||||
|
*/
|
||||||
|
module.exports = {
|
||||||
|
solidity: {
|
||||||
|
compilers: [
|
||||||
|
{
|
||||||
|
version: "0.7.6",
|
||||||
|
settings: {
|
||||||
|
optimizer: {
|
||||||
|
enabled: true,
|
||||||
|
runs: 200,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
version: "0.6.0",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
version: "0.6.2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
version: "0.6.12",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
version: "0.6.5",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
networks: {
|
||||||
|
// defaultNetwork: "hardhat",
|
||||||
|
kovan: {
|
||||||
|
url: `https://eth-kovan.alchemyapi.io/v2/${ALCHEMY_ID}`,
|
||||||
|
accounts: [`0x${PRIVATE_KEY}`],
|
||||||
|
},
|
||||||
|
mainnet: {
|
||||||
|
url: `https://eth-mainnet.alchemyapi.io/v2/${ALCHEMY_ID}`,
|
||||||
|
accounts: [`0x${PRIVATE_KEY}`],
|
||||||
|
timeout: 150000,
|
||||||
|
gasPrice: parseInt(utils.parseUnits("30", "gwei")),
|
||||||
|
},
|
||||||
|
rinkeby: {
|
||||||
|
url: `https://eth-rinkeby.alchemyapi.io/v2/${ALCHEMY_ID}`,
|
||||||
|
accounts: [`0x${PRIVATE_KEY}`],
|
||||||
|
timeout: 150000,
|
||||||
|
},
|
||||||
|
hardhat: {
|
||||||
|
forking: {
|
||||||
|
url: `https://eth-mainnet.alchemyapi.io/v2/${ALCHEMY_ID}`,
|
||||||
|
blockNumber: 12696000,
|
||||||
|
},
|
||||||
|
blockGasLimit: 12000000,
|
||||||
|
},
|
||||||
|
matic: {
|
||||||
|
url: "https://rpc-mainnet.maticvigil.com/",
|
||||||
|
accounts: [`0x${PRIVATE_KEY}`],
|
||||||
|
timeout: 150000,
|
||||||
|
gasPrice: parseInt(utils.parseUnits("1", "gwei")),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
etherscan: {
|
||||||
|
apiKey: ETHERSCAN_API_KEY,
|
||||||
|
},
|
||||||
|
tenderly: {
|
||||||
|
project: process.env.TENDERLY_PROJECT,
|
||||||
|
username: process.env.TENDERLY_USERNAME,
|
||||||
|
},
|
||||||
|
mocha: {
|
||||||
|
timeout: 100 * 1000,
|
||||||
|
},
|
||||||
|
};
|
|
@ -1,44 +1,21 @@
|
||||||
const { expect } = require("chai");
|
const { expect } = require("chai");
|
||||||
const hre = require("hardhat");
|
const hre = require("hardhat");
|
||||||
const { web3, deployments, waffle, ethers } = hre;
|
const { waffle, ethers } = hre;
|
||||||
const { provider, deployContract } = waffle
|
const { provider } = waffle
|
||||||
|
|
||||||
const deployAndEnableConnector = require("../../scripts/deployAndEnableConnector.js")
|
const deployAndEnableConnector = require("../../scripts/deployAndEnableConnector.js")
|
||||||
const buildDSAv2 = require("../../scripts/buildDSAv2")
|
const buildDSAv2 = require("../../scripts/buildDSAv2")
|
||||||
const encodeSpells = require("../../scripts/encodeSpells.js")
|
const encodeSpells = require("../../scripts/encodeSpells.js")
|
||||||
const encodeFlashcastData = require("../../scripts/encodeFlashcastData.js")
|
|
||||||
const getMasterSigner = require("../../scripts/getMasterSigner")
|
const getMasterSigner = require("../../scripts/getMasterSigner")
|
||||||
const addLiquidity = require("../../scripts/addLiquidity");
|
const addLiquidity = require("../../scripts/addLiquidity");
|
||||||
|
|
||||||
const addresses = require("../../scripts/constant/addresses");
|
const addresses = require("../../scripts/constant/addresses");
|
||||||
const abis = require("../../scripts/constant/abis");
|
const abis = require("../../scripts/constant/abis");
|
||||||
const constants = require("../../scripts/constant/constant");
|
|
||||||
const tokens = require("../../scripts/constant/tokens");
|
|
||||||
const { abi: nftManagerAbi } = require("@uniswap/v3-periphery/artifacts/contracts/NonfungiblePositionManager.sol/NonfungiblePositionManager.json")
|
|
||||||
|
|
||||||
const connectV2SushiswapArtifacts = require("../../artifacts/contracts/mainnet/connectors/sushiswap/main.sol/ConnectV2Sushiswap.json");
|
const connectV2SushiswapArtifacts = require("../../artifacts/contracts/mainnet/connectors/sushiswap/main.sol/ConnectV2Sushiswap.json");
|
||||||
const { eth } = require("../../scripts/constant/tokens");
|
|
||||||
const { BigNumber } = require("ethers");
|
|
||||||
|
|
||||||
const FeeAmount = {
|
|
||||||
LOW: 500,
|
|
||||||
MEDIUM: 3000,
|
|
||||||
HIGH: 10000,
|
|
||||||
}
|
|
||||||
|
|
||||||
const TICK_SPACINGS = {
|
|
||||||
500: 10,
|
|
||||||
3000: 60,
|
|
||||||
10000: 200
|
|
||||||
}
|
|
||||||
|
|
||||||
const USDT_ADDR = "0xdac17f958d2ee523a2206206994597c13d831ec7"
|
|
||||||
const DAI_ADDR = "0x6b175474e89094c44da98b954eedeac495271d0f"
|
const DAI_ADDR = "0x6b175474e89094c44da98b954eedeac495271d0f"
|
||||||
|
|
||||||
let tokenIds = []
|
|
||||||
let liquidities = []
|
|
||||||
const abiCoder = ethers.utils.defaultAbiCoder
|
|
||||||
|
|
||||||
describe("Sushiswap", function () {
|
describe("Sushiswap", function () {
|
||||||
const connectorName = "Sushiswap-v1"
|
const connectorName = "Sushiswap-v1"
|
||||||
|
|
||||||
|
@ -134,30 +111,6 @@ describe("Sushiswap", function () {
|
||||||
|
|
||||||
const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), wallet1.address)
|
const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), wallet1.address)
|
||||||
let receipt = await tx.wait()
|
let receipt = await tx.wait()
|
||||||
// let castEvent = new Promise((resolve, reject) => {
|
|
||||||
// dsaWallet0.on('LogCast', (origin, sender, value, targetNames, targets, eventNames, eventParams, event) => {
|
|
||||||
// const params = abiCoder.decode(["uint256", "uint256", "uint256", "uint256", "int24", "int24"], eventParams[0]);
|
|
||||||
// const params1 = abiCoder.decode(["uint256", "uint256", "uint256", "uint256", "int24", "int24"], eventParams[2]);
|
|
||||||
// tokenIds.push(params[0]);
|
|
||||||
// tokenIds.push(params1[0]);
|
|
||||||
// liquidities.push(params[1]);
|
|
||||||
// event.removeListener();
|
|
||||||
|
|
||||||
// resolve({
|
|
||||||
// eventNames,
|
|
||||||
// });
|
|
||||||
// });
|
|
||||||
|
|
||||||
// setTimeout(() => {
|
|
||||||
// reject(new Error('timeout'));
|
|
||||||
// }, 60000)
|
|
||||||
// });
|
|
||||||
|
|
||||||
// let event = await castEvent
|
|
||||||
|
|
||||||
// const data = await nftManager.positions(tokenIds[0])
|
|
||||||
|
|
||||||
// expect(data.liquidity).to.be.equals(liquidities[0]);
|
|
||||||
}).timeout(10000000000);
|
}).timeout(10000000000);
|
||||||
|
|
||||||
it("Should withdraw successfully", async function () {
|
it("Should withdraw successfully", async function () {
|
||||||
|
|
237
test/sushiswapIncentive/sushiIncentive.test.js
Normal file
237
test/sushiswapIncentive/sushiIncentive.test.js
Normal file
|
@ -0,0 +1,237 @@
|
||||||
|
const { expect } = require("chai");
|
||||||
|
const hre = require("hardhat");
|
||||||
|
const { waffle, ethers } = hre;
|
||||||
|
const { provider } = waffle
|
||||||
|
|
||||||
|
const deployAndEnableConnector = require("../../scripts/deployAndEnableConnector.js")
|
||||||
|
const buildDSAv2 = require("../../scripts/buildDSAv2")
|
||||||
|
const encodeSpells = require("../../scripts/encodeSpells.js")
|
||||||
|
const getMasterSigner = require("../../scripts/getMasterSigner")
|
||||||
|
const addLiquidity = require("../../scripts/addLiquidity");
|
||||||
|
|
||||||
|
const addresses = require("../../scripts/constant/addresses");
|
||||||
|
const abis = require("../../scripts/constant/abis");
|
||||||
|
|
||||||
|
const connectV2SushiswapArtifacts = require("../../artifacts/contracts/mainnet/connectors/sushiswap/main.sol/ConnectV2Sushiswap.json");
|
||||||
|
const connectV2SushiswapIncentiveArtifacts = require("../../artifacts/contracts/mainnet/connectors/sushi-incentive/main.sol/ConnectV2SushiswapIncentive.json");
|
||||||
|
|
||||||
|
const DAI_ADDR = "0x6b175474e89094c44da98b954eedeac495271d0f"
|
||||||
|
const WETH_ADDR = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
|
||||||
|
|
||||||
|
describe("Sushiswap", function () {
|
||||||
|
const connectorName = "Sushiswap-v1"
|
||||||
|
const incentiveConnectorName = "Sushiswp-Incentive-v1"
|
||||||
|
|
||||||
|
let dsaWallet0
|
||||||
|
let masterSigner;
|
||||||
|
let instaConnectorsV2;
|
||||||
|
let connector, connectorIncentive;
|
||||||
|
|
||||||
|
const wallets = provider.getWallets()
|
||||||
|
const [wallet0, wallet1, wallet2, wallet3] = wallets
|
||||||
|
before(async () => {
|
||||||
|
await hre.network.provider.request({
|
||||||
|
method: "hardhat_reset",
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
forking: {
|
||||||
|
jsonRpcUrl: hre.config.networks.hardhat.forking.url,
|
||||||
|
blockNumber: 13005785,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
masterSigner = await getMasterSigner(wallet3)
|
||||||
|
instaConnectorsV2 = await ethers.getContractAt(abis.core.connectorsV2, addresses.core.connectorsV2);
|
||||||
|
connector = await deployAndEnableConnector({
|
||||||
|
connectorName,
|
||||||
|
contractArtifact: connectV2SushiswapArtifacts,
|
||||||
|
signer: masterSigner,
|
||||||
|
connectors: instaConnectorsV2
|
||||||
|
})
|
||||||
|
console.log("Connector address", connector.address)
|
||||||
|
|
||||||
|
connectorIncentive = await deployAndEnableConnector({
|
||||||
|
connectorName: incentiveConnectorName,
|
||||||
|
contractArtifact: connectV2SushiswapIncentiveArtifacts,
|
||||||
|
signer: masterSigner,
|
||||||
|
connectors: instaConnectorsV2
|
||||||
|
})
|
||||||
|
console.log("Incentive Connector address", connectorIncentive.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 & DAI 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"));
|
||||||
|
|
||||||
|
await addLiquidity("dai", dsaWallet0.address, ethers.utils.parseEther("100000"));
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Deposit ETH & USDT 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"));
|
||||||
|
|
||||||
|
await addLiquidity("usdt", dsaWallet0.address, ethers.utils.parseEther("100000"));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("Main", function () {
|
||||||
|
|
||||||
|
it("Should deposit successfully", async function () {
|
||||||
|
const ethAmount = ethers.utils.parseEther("2") // 1 ETH
|
||||||
|
const daiUnitAmount = ethers.utils.parseEther("4000") // 1 ETH
|
||||||
|
const usdtAmount = ethers.utils.parseEther("400") / Math.pow(10, 12) // 1 ETH
|
||||||
|
const ethAddress = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"
|
||||||
|
|
||||||
|
const getId = "0"
|
||||||
|
const setId = "0"
|
||||||
|
|
||||||
|
const spells = [
|
||||||
|
{
|
||||||
|
connector: connectorName,
|
||||||
|
method: "deposit",
|
||||||
|
args: [
|
||||||
|
ethAddress,
|
||||||
|
DAI_ADDR,
|
||||||
|
ethAmount,
|
||||||
|
daiUnitAmount,
|
||||||
|
"500000000000000000",
|
||||||
|
getId,
|
||||||
|
setId
|
||||||
|
],
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), wallet1.address)
|
||||||
|
await tx.wait()
|
||||||
|
|
||||||
|
describe("Incentive", () => {
|
||||||
|
it("Should deposit successfully", async () => {
|
||||||
|
const getId = 0
|
||||||
|
const setId = 0
|
||||||
|
const spells = [
|
||||||
|
{
|
||||||
|
connector: incentiveConnectorName,
|
||||||
|
method: "deposit",
|
||||||
|
args: [
|
||||||
|
WETH_ADDR,
|
||||||
|
DAI_ADDR,
|
||||||
|
ethers.utils.parseEther("10"),
|
||||||
|
getId,
|
||||||
|
setId
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), wallet0.address)
|
||||||
|
await tx.wait();
|
||||||
|
})
|
||||||
|
|
||||||
|
it("Should harvest successfully", async () => {
|
||||||
|
const setId = 0
|
||||||
|
const spells = [
|
||||||
|
{
|
||||||
|
connector: incentiveConnectorName,
|
||||||
|
method: "harvest",
|
||||||
|
args: [
|
||||||
|
WETH_ADDR,
|
||||||
|
DAI_ADDR,
|
||||||
|
setId
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), wallet0.address)
|
||||||
|
await tx.wait();
|
||||||
|
})
|
||||||
|
|
||||||
|
it("Should harvest and withdraw successfully", async () => {
|
||||||
|
const getId = 0
|
||||||
|
const setId = 0
|
||||||
|
const spells = [
|
||||||
|
{
|
||||||
|
connector: incentiveConnectorName,
|
||||||
|
method: "withdrawAndHarvest",
|
||||||
|
args: [
|
||||||
|
WETH_ADDR,
|
||||||
|
DAI_ADDR,
|
||||||
|
ethers.utils.parseEther("1"),
|
||||||
|
getId,
|
||||||
|
setId
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), wallet0.address)
|
||||||
|
await tx.wait();
|
||||||
|
})
|
||||||
|
|
||||||
|
it("Should withdraw successfully", async () => {
|
||||||
|
const getId = 0
|
||||||
|
const setId = 0
|
||||||
|
const spells = [
|
||||||
|
{
|
||||||
|
connector: incentiveConnectorName,
|
||||||
|
method: "withdraw",
|
||||||
|
args: [
|
||||||
|
WETH_ADDR,
|
||||||
|
DAI_ADDR,
|
||||||
|
ethers.utils.parseEther("1"),
|
||||||
|
getId,
|
||||||
|
setId
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), wallet0.address)
|
||||||
|
await tx.wait();
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}).timeout(10000000000);
|
||||||
|
|
||||||
|
it("Should buy successfully", async function () {
|
||||||
|
const ethAmount = ethers.utils.parseEther("0.1") // 1 ETH
|
||||||
|
const daiUnitAmount = ethers.utils.parseEther("4000") // 1 ETH
|
||||||
|
const ethAddress = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"
|
||||||
|
|
||||||
|
const getId = "0"
|
||||||
|
const setId = "0"
|
||||||
|
|
||||||
|
const spells = [
|
||||||
|
{
|
||||||
|
connector: connectorName,
|
||||||
|
method: "buy",
|
||||||
|
args: [
|
||||||
|
ethAddress,
|
||||||
|
DAI_ADDR,
|
||||||
|
ethAmount,
|
||||||
|
daiUnitAmount,
|
||||||
|
getId,
|
||||||
|
setId
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), wallet1.address)
|
||||||
|
let receipt = await tx.wait()
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
Loading…
Reference in New Issue
Block a user