mirror of
https://github.com/Instadapp/dsa-connectors.git
synced 2024-07-29 22:37:00 +00:00
add test for instadapp event return values. address PR comments:
- add setUints to all applicable functions - use uint256 rather than uint for event data
This commit is contained in:
parent
ec8fd393a1
commit
97db94fe59
|
@ -28,15 +28,15 @@ contract Events {
|
|||
uint getRepayId,
|
||||
uint setBorrowId
|
||||
);
|
||||
event LogClaimCollateralFromRedemption(address indexed borrower);
|
||||
event LogClaimCollateralFromRedemption(address indexed borrower, uint amount, uint setId);
|
||||
|
||||
/* Stability Pool */
|
||||
event LogStabilityDeposit(address indexed borrower, uint amount, address frontendTag, uint getId);
|
||||
event LogStabilityWithdraw(address indexed borrower, uint amount, uint setId);
|
||||
event LogStabilityMoveEthGainToTrove(address indexed borrower);
|
||||
event LogStabilityMoveEthGainToTrove(address indexed borrower, uint amount);
|
||||
|
||||
/* Staking */
|
||||
event LogStake(address indexed borrower, uint amount, uint getId);
|
||||
event LogUnstake(address indexed borrower, uint amount, uint setId);
|
||||
event LogClaimGains(address indexed borrower);
|
||||
event LogClaimStakingGains(address indexed borrower, uint ethAmount, uint lusdAmount);
|
||||
}
|
||||
|
|
|
@ -52,9 +52,16 @@ interface StabilityPoolLike {
|
|||
function provideToSP(uint _amount, address _frontEndTag) external;
|
||||
function withdrawFromSP(uint _amount) external;
|
||||
function withdrawETHGainToTrove(address _upperHint, address _lowerHint) external;
|
||||
function getDepositorETHGain(address _depositor) external view returns (uint);
|
||||
}
|
||||
|
||||
interface StakingLike {
|
||||
function stake(uint _LQTYamount) external;
|
||||
function unstake(uint _LQTYamount) external;
|
||||
function getPendingETHGain(address _user) external view returns (uint);
|
||||
function getPendingLUSDGain(address _user) external view returns (uint);
|
||||
}
|
||||
|
||||
interface CollateralSurplusLike {
|
||||
function getCollateral(address _account) external view returns (uint);
|
||||
}
|
||||
|
|
|
@ -4,12 +4,17 @@ pragma solidity ^0.7.6;
|
|||
* @title Liquity.
|
||||
* @dev Lending & Borrowing.
|
||||
*/
|
||||
import "hardhat/console.sol";
|
||||
|
||||
import { BorrowerOperationsLike, TroveManagerLike, StabilityPoolLike, StakingLike } from "./interface.sol";
|
||||
import {
|
||||
BorrowerOperationsLike,
|
||||
TroveManagerLike,
|
||||
StabilityPoolLike,
|
||||
StakingLike,
|
||||
CollateralSurplusLike
|
||||
} from "./interface.sol";
|
||||
import { Stores } from "../../common/stores.sol";
|
||||
import { Helpers } from "./helpers.sol";
|
||||
import { Events } from "./events.sol";
|
||||
import "hardhat/console.sol";
|
||||
|
||||
abstract contract LiquityResolver is Events, Helpers {
|
||||
BorrowerOperationsLike internal constant borrowerOperations =
|
||||
|
@ -20,7 +25,10 @@ abstract contract LiquityResolver is Events, Helpers {
|
|||
StabilityPoolLike(0x66017D22b0f8556afDd19FC67041899Eb65a21bb);
|
||||
StakingLike internal constant staking =
|
||||
StakingLike(0x4f9Fbb3f1E99B56e0Fe2892e623Ed36A76Fc605d);
|
||||
|
||||
CollateralSurplusLike internal constant collateralSurplus =
|
||||
CollateralSurplusLike(0x3D32e8b97Ed5881324241Cf03b2DA5E2EBcE5521);
|
||||
|
||||
// Prevents stack-too-deep error
|
||||
struct AdjustTrove {
|
||||
uint maxFeePercentage;
|
||||
uint withdrawAmount;
|
||||
|
@ -30,10 +38,6 @@ abstract contract LiquityResolver is Events, Helpers {
|
|||
bool isBorrow;
|
||||
}
|
||||
|
||||
constructor() {
|
||||
console.log("Liquity Connector contract deployed at", address(this));
|
||||
}
|
||||
|
||||
/* Begin: Trove */
|
||||
|
||||
/**
|
||||
|
@ -56,7 +60,17 @@ abstract contract LiquityResolver is Events, Helpers {
|
|||
uint getId,
|
||||
uint setId
|
||||
) external payable returns (string memory _eventName, bytes memory _eventParam) {
|
||||
// User can either send ETH directly or have it collected from a previous spell
|
||||
/*
|
||||
User has three options for depositing ETH collateral to open a Trove:
|
||||
- Send ETH directly with this function call
|
||||
- Have ETH collected from a previous spell
|
||||
- Have ETH collected from the DSA's existing balance
|
||||
*/
|
||||
|
||||
if (getId != 0 && depositAmount != 0) {
|
||||
revert("open(): Cannot supply a depositAmount if a non-zero getId is supplied");
|
||||
}
|
||||
|
||||
depositAmount = getUint(getId, depositAmount);
|
||||
|
||||
borrowerOperations.openTrove{value: depositAmount}(
|
||||
|
@ -68,7 +82,7 @@ abstract contract LiquityResolver is Events, Helpers {
|
|||
|
||||
// Allow other spells to use the borrowed amount
|
||||
setUint(setId, borrowAmount);
|
||||
_eventName = "LogOpen(address,uint,uint,uint,uint,uint)";
|
||||
_eventName = "LogOpen(address,uint256,uint256,uint256,uint256,uint256)";
|
||||
_eventParam = abi.encode(msg.sender, maxFeePercentage, depositAmount, borrowAmount, getId, setId);
|
||||
}
|
||||
|
||||
|
@ -83,7 +97,7 @@ abstract contract LiquityResolver is Events, Helpers {
|
|||
|
||||
// Allow other spells to use the collateral released from the Trove
|
||||
setUint(setId, collateral);
|
||||
_eventName = "LogClose(address,uint)";
|
||||
_eventName = "LogClose(address,uint256)";
|
||||
_eventParam = abi.encode(msg.sender, setId);
|
||||
}
|
||||
|
||||
|
@ -101,9 +115,12 @@ abstract contract LiquityResolver is Events, Helpers {
|
|||
address lowerHint,
|
||||
uint getId
|
||||
) external payable returns (string memory _eventName, bytes memory _eventParam) {
|
||||
if (getId != 0 && amount != 0) {
|
||||
revert("deposit(): Cannot supply an amount if a non-zero getId is supplied");
|
||||
}
|
||||
amount = getUint(getId, amount);
|
||||
borrowerOperations.addColl{value: amount}(upperHint, lowerHint);
|
||||
_eventName = "LogDeposit(address,uint,uint)";
|
||||
_eventName = "LogDeposit(address,uint256,uint256)";
|
||||
_eventParam = abi.encode(msg.sender, amount, getId);
|
||||
}
|
||||
|
||||
|
@ -124,7 +141,7 @@ abstract contract LiquityResolver is Events, Helpers {
|
|||
borrowerOperations.withdrawColl(amount, upperHint, lowerHint);
|
||||
|
||||
setUint(setId, amount);
|
||||
_eventName = "LogWithdraw(address,uint,uint)";
|
||||
_eventName = "LogWithdraw(address,uint256,uint256)";
|
||||
_eventParam = abi.encode(msg.sender, amount, setId);
|
||||
}
|
||||
|
||||
|
@ -147,7 +164,7 @@ abstract contract LiquityResolver is Events, Helpers {
|
|||
borrowerOperations.withdrawLUSD(maxFeePercentage, amount, upperHint, lowerHint);
|
||||
|
||||
setUint(setId, amount); // TODO: apply fee / get exact amount borrowed (with the fee applied)
|
||||
_eventName = "LogBorrow(address,uint,uint)";
|
||||
_eventName = "LogBorrow(address,uint256,uint256)";
|
||||
_eventParam = abi.encode(msg.sender, amount, setId);
|
||||
}
|
||||
|
||||
|
@ -165,9 +182,12 @@ abstract contract LiquityResolver is Events, Helpers {
|
|||
address lowerHint,
|
||||
uint getId
|
||||
) external payable returns (string memory _eventName, bytes memory _eventParam) {
|
||||
if (getId != 0 && amount != 0) {
|
||||
revert("repay(): Cannot supply an amount if a non-zero getId is supplied");
|
||||
}
|
||||
amount = getUint(getId, amount);
|
||||
borrowerOperations.repayLUSD(amount, upperHint, lowerHint);
|
||||
_eventName = "LogRepay(address,uint,uint)";
|
||||
_eventName = "LogRepay(address,uint256,uint256)";
|
||||
_eventParam = abi.encode(msg.sender, amount, getId);
|
||||
}
|
||||
|
||||
|
@ -199,6 +219,13 @@ abstract contract LiquityResolver is Events, Helpers {
|
|||
uint getRepayId,
|
||||
uint setBorrowId
|
||||
) external payable returns (string memory _eventName, bytes memory _eventParam) {
|
||||
if (getDepositId != 0 && depositAmount != 0) {
|
||||
revert("adjust(): Cannot supply a depositAmount if a non-zero getDepositId is supplied");
|
||||
}
|
||||
if (getRepayId != 0 && repayAmount != 0) {
|
||||
revert("adjust(): Cannot supply a repayAmount if a non-zero getRepayId is supplied");
|
||||
}
|
||||
|
||||
AdjustTrove memory adjustTrove;
|
||||
|
||||
adjustTrove.maxFeePercentage = maxFeePercentage;
|
||||
|
@ -223,18 +250,22 @@ abstract contract LiquityResolver is Events, Helpers {
|
|||
// Allow other spells to use the borrowed amount
|
||||
setUint(setBorrowId, borrowAmount);
|
||||
|
||||
_eventName = "LogAdjust(address,uint,uint,uint,uint,uint,uint,uint,uint,uint)";
|
||||
_eventParam = abi.encode(msg.sender, maxFeePercentage, depositAmount, borrowAmount, getDepositId, setWithdrawId, getRepayId, setBorrowId);
|
||||
_eventName = "LogAdjust(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)";
|
||||
_eventParam = abi.encode(msg.sender, maxFeePercentage, depositAmount, withdrawAmount, borrowAmount, repayAmount, getDepositId, setWithdrawId, getRepayId, setBorrowId);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Withdraw remaining ETH balance from user's redeemed Trove to their DSA
|
||||
* @param setId Optional storage slot to store the ETH claimed
|
||||
* @notice Claim remaining collateral from Trove
|
||||
*/
|
||||
function claimCollateralFromRedemption() external returns(string memory _eventName, bytes memory _eventParam) {
|
||||
function claimCollateralFromRedemption(uint setId) external returns(string memory _eventName, bytes memory _eventParam) {
|
||||
uint amount = collateralSurplus.getCollateral(address(this));
|
||||
borrowerOperations.claimCollateral();
|
||||
_eventName = "LogClaimCollateralFromRedemption(address)";
|
||||
_eventParam = abi.encode(msg.sender);
|
||||
setUint(setId, amount);
|
||||
|
||||
_eventName = "LogClaimCollateralFromRedemption(address,uint256,uint256)";
|
||||
_eventParam = abi.encode(msg.sender, amount, setId);
|
||||
}
|
||||
/* End: Trove */
|
||||
|
||||
|
@ -256,7 +287,7 @@ abstract contract LiquityResolver is Events, Helpers {
|
|||
|
||||
stabilityPool.provideToSP(amount, frontendTag);
|
||||
|
||||
_eventName = "LogStabilityDeposit(address,uint,address,uint)";
|
||||
_eventName = "LogStabilityDeposit(address,uint256,address,uint256)";
|
||||
_eventParam = abi.encode(msg.sender, amount, frontendTag, getId);
|
||||
}
|
||||
|
||||
|
@ -273,7 +304,7 @@ abstract contract LiquityResolver is Events, Helpers {
|
|||
stabilityPool.withdrawFromSP(amount);
|
||||
setUint(setId, amount);
|
||||
|
||||
_eventName = "LogStabilityWithdraw(address,uint,uint)";
|
||||
_eventName = "LogStabilityWithdraw(address,uint256,uint256)";
|
||||
_eventParam = abi.encode(msg.sender, amount, setId);
|
||||
}
|
||||
|
||||
|
@ -287,10 +318,10 @@ abstract contract LiquityResolver is Events, Helpers {
|
|||
address upperHint,
|
||||
address lowerHint
|
||||
) external returns (string memory _eventName, bytes memory _eventParam) {
|
||||
uint amount = stabilityPool.getDepositorETHGain(address(this));
|
||||
stabilityPool.withdrawETHGainToTrove(upperHint, lowerHint);
|
||||
|
||||
_eventName = "LogStabilityMoveEthGainToTrove(address)";
|
||||
_eventParam = abi.encode(msg.sender);
|
||||
_eventName = "LogStabilityMoveEthGainToTrove(address,uint256)";
|
||||
_eventParam = abi.encode(msg.sender, amount);
|
||||
}
|
||||
/* End: Stability Pool */
|
||||
|
||||
|
@ -308,7 +339,7 @@ abstract contract LiquityResolver is Events, Helpers {
|
|||
) external returns (string memory _eventName, bytes memory _eventParam) {
|
||||
amount = getUint(getId, amount);
|
||||
staking.stake(amount);
|
||||
_eventName = "LogStake(address,uint,uint)";
|
||||
_eventName = "LogStake(address,uint256,uint256)";
|
||||
_eventParam = abi.encode(msg.sender, amount, getId);
|
||||
}
|
||||
|
||||
|
@ -324,19 +355,27 @@ abstract contract LiquityResolver is Events, Helpers {
|
|||
) external returns (string memory _eventName, bytes memory _eventParam) {
|
||||
staking.unstake(amount);
|
||||
setUint(setId, amount);
|
||||
_eventName = "LogUnstake(address,uint,uint)";
|
||||
_eventName = "LogUnstake(address,uint256,uint256)";
|
||||
_eventParam = abi.encode(msg.sender, amount, setId);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Sends ETH and LUSD gains from Staking to user
|
||||
* @notice Claim ETH and LUSD gains from Staking
|
||||
* @param setEthGainId Optional storage slot to store the claimed ETH
|
||||
* @param setLusdGainId Optional storage slot to store the claimed LUSD
|
||||
*/
|
||||
function claimGains() external returns (string memory _eventName, bytes memory _eventParam) {
|
||||
// claims are gained when a user's stake is adjusted, so we unstake 0 to trigger the claim
|
||||
staking.unstake(0);
|
||||
_eventName = "LogClaimGains(address)";
|
||||
_eventParam = abi.encode(msg.sender);
|
||||
function claimStakingGains(uint setEthGainId, uint setLusdGainId) external returns (string memory _eventName, bytes memory _eventParam) {
|
||||
uint ethAmount = staking.getPendingETHGain(address(this));
|
||||
uint lusdAmount = staking.getPendingLUSDGain(address(this));
|
||||
|
||||
// Gains are claimed when a user's stake is adjusted, so we unstake 0 to trigger the claim
|
||||
staking.unstake(0);
|
||||
setUint(setEthGainId, ethAmount);
|
||||
setUint(setLusdGainId, lusdAmount);
|
||||
|
||||
_eventName = "LogClaimStakingGains(address,uint256,uint256)";
|
||||
_eventParam = abi.encode(msg.sender, ethAmount, lusdAmount);
|
||||
}
|
||||
/* End: Staking */
|
||||
|
||||
|
|
|
@ -60,6 +60,11 @@ const LQTY_TOKEN_ABI = [
|
|||
"function transfer(address _to, uint256 _value) public returns (bool success)",
|
||||
];
|
||||
|
||||
const COLL_SURPLUS_ADDRESS = "0x3D32e8b97Ed5881324241Cf03b2DA5E2EBcE5521";
|
||||
const COLL_SURPLUS_ABI = [
|
||||
"function getCollateral(address _account) external view returns (uint)",
|
||||
];
|
||||
|
||||
module.exports = {
|
||||
TROVE_MANAGER_ADDRESS,
|
||||
TROVE_MANAGER_ABI,
|
||||
|
@ -81,4 +86,6 @@ module.exports = {
|
|||
STAKING_ABI,
|
||||
LQTY_TOKEN_ADDRESS,
|
||||
LQTY_TOKEN_ABI,
|
||||
COLL_SURPLUS_ADDRESS,
|
||||
COLL_SURPLUS_ABI,
|
||||
};
|
|
@ -5,6 +5,7 @@ const hardhatConfig = require("../../hardhat.config");
|
|||
const deployAndEnableConnector = require("../../scripts/deployAndEnableConnector.js");
|
||||
const encodeSpells = require("../../scripts/encodeSpells.js");
|
||||
const getMasterSigner = require("../../scripts/getMasterSigner");
|
||||
const buildDSAv2 = require("../../scripts/buildDSAv2");
|
||||
|
||||
// Instadapp instadappAddresses/ABIs
|
||||
const instadappAddresses = require("../../scripts/constant/addresses");
|
||||
|
@ -13,12 +14,13 @@ const instadappAbi = require("../../scripts/constant/abis");
|
|||
// Instadapp Liquity Connector artifacts
|
||||
const connectV2LiquityArtifacts = require("../../artifacts/contracts/mainnet/connectors/liquity/main.sol/ConnectV2Liquity.json");
|
||||
const connectV2BasicV1Artifacts = require("../../artifacts/contracts/mainnet/connectors/basic/main.sol/ConnectV2Basic.json");
|
||||
const { ethers } = require("hardhat");
|
||||
|
||||
const CONNECTOR_NAME = "LIQUITY-v1-TEST";
|
||||
const LUSD_GAS_COMPENSATION = hre.ethers.utils.parseUnits("200", 18); // 200 LUSD gas compensation repaid after loan repayment
|
||||
const BLOCK_NUMBER = 12478159; // Deterministic block number for tests to run against, if you change this, tests will break.
|
||||
const LIQUIDATABLE_TROVES_BLOCK_NUMBER = 12478159; // Deterministic block number for tests to run against, if you change this, tests will break.
|
||||
const JUSTIN_SUN_ADDRESS = "0x903d12bf2c57a29f32365917c706ce0e1a84cce3"; // LQTY whale address
|
||||
const LIQUIDATABLE_TROVE_ADDRESS = "0xafbeb4cb97f3b08ec2fe07ef0dac15d37013a347"; // Trove which is liquidatable at blockNumber: BLOCK_NUMBER
|
||||
const LIQUIDATABLE_TROVE_ADDRESS = "0xafbeb4cb97f3b08ec2fe07ef0dac15d37013a347"; // Trove which is liquidatable at blockNumber: LIQUIDATABLE_TROVES_BLOCK_NUMBER
|
||||
const MAX_GAS = hardhatConfig.networks.hardhat.blockGasLimit; // Maximum gas limit (12000000)
|
||||
|
||||
const openTroveSpell = async (
|
||||
|
@ -48,12 +50,11 @@ const openTroveSpell = async (
|
|||
0,
|
||||
],
|
||||
};
|
||||
const openTx = await dsa
|
||||
return await dsa
|
||||
.connect(signer)
|
||||
.cast(...encodeSpells([openTroveSpell]), address, {
|
||||
value: depositAmount,
|
||||
});
|
||||
return await openTx.wait();
|
||||
};
|
||||
|
||||
const createDsaTrove = async (
|
||||
|
@ -92,6 +93,13 @@ const sendToken = async (token, amount, from, to) => {
|
|||
return await token.connect(signer).transfer(to, amount);
|
||||
};
|
||||
|
||||
const resetInitialState = async (walletAddress, contracts, isDebug = false) => {
|
||||
const liquity = await deployAndConnect(contracts, isDebug);
|
||||
const dsa = await buildDSAv2(walletAddress);
|
||||
|
||||
return [liquity, dsa];
|
||||
};
|
||||
|
||||
const resetHardhatBlockNumber = async (blockNumber) => {
|
||||
return await hre.network.provider.request({
|
||||
method: "hardhat_reset",
|
||||
|
@ -108,7 +116,7 @@ const resetHardhatBlockNumber = async (blockNumber) => {
|
|||
|
||||
const deployAndConnect = async (contracts, isDebug = false) => {
|
||||
// Pin Liquity tests to a particular block number to create deterministic state (Ether price etc.)
|
||||
await resetHardhatBlockNumber(BLOCK_NUMBER);
|
||||
await resetHardhatBlockNumber(LIQUIDATABLE_TROVES_BLOCK_NUMBER);
|
||||
|
||||
const liquity = {
|
||||
troveManager: null,
|
||||
|
@ -121,6 +129,7 @@ const deployAndConnect = async (contracts, isDebug = false) => {
|
|||
hintHelpers: null,
|
||||
sortedTroves: null,
|
||||
staking: null,
|
||||
collSurplus: null,
|
||||
};
|
||||
|
||||
const masterSigner = await getMasterSigner();
|
||||
|
@ -230,6 +239,14 @@ const deployAndConnect = async (contracts, isDebug = false) => {
|
|||
);
|
||||
isDebug && console.log("Staking contract address", liquity.staking.address);
|
||||
|
||||
liquity.collSurplus = new ethers.Contract(
|
||||
contracts.COLL_SURPLUS_ADDRESS,
|
||||
contracts.COLL_SURPLUS_ABI,
|
||||
ethers.provider
|
||||
);
|
||||
isDebug &&
|
||||
console.log("CollSurplus contract address", liquity.collSurplus.address);
|
||||
|
||||
return liquity;
|
||||
};
|
||||
|
||||
|
@ -310,18 +327,48 @@ const getRedemptionHints = async (
|
|||
};
|
||||
};
|
||||
|
||||
const redeem = async (amount, from, to, liquity) => {
|
||||
await sendToken(liquity.lusdToken, amount, from, to);
|
||||
const {
|
||||
partialRedemptionHintNicr,
|
||||
firstRedemptionHint,
|
||||
upperHint,
|
||||
lowerHint,
|
||||
} = await getRedemptionHints(
|
||||
amount,
|
||||
liquity.hintHelpers,
|
||||
liquity.sortedTroves,
|
||||
liquity.priceFeed
|
||||
);
|
||||
const maxFeePercentage = ethers.utils.parseUnits("0.5", 18); // 0.5% max fee
|
||||
|
||||
return await liquity.troveManager
|
||||
.connect(wallet)
|
||||
.redeemCollateral(
|
||||
amount,
|
||||
firstRedemptionHint,
|
||||
upperHint,
|
||||
lowerHint,
|
||||
partialRedemptionHintNicr,
|
||||
0,
|
||||
maxFeePercentage,
|
||||
{
|
||||
gasLimit: MAX_GAS, // permit max gas
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
deployAndConnect,
|
||||
resetInitialState,
|
||||
createDsaTrove,
|
||||
openTroveSpell,
|
||||
sendToken,
|
||||
getTroveInsertionHints,
|
||||
getRedemptionHints,
|
||||
redeem,
|
||||
CONNECTOR_NAME,
|
||||
LUSD_GAS_COMPENSATION,
|
||||
BLOCK_NUMBER,
|
||||
JUSTIN_SUN_ADDRESS,
|
||||
LIQUIDATABLE_TROVE_ADDRESS,
|
||||
MAX_GAS,
|
||||
resetHardhatBlockNumber,
|
||||
getTroveInsertionHints,
|
||||
getRedemptionHints,
|
||||
};
|
||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user