Skip to content

Commit e0cf003

Browse files
ckoopmannpblivin0x
andauthored
feat: HyETH Flashmint contract (#173)
* First version of FlashMintHyETH * Add tests * First test succesfully issuing hyETH with only instadapp component * Succesfully redeeming * Start working on pendle integration * More pendle integration * Swap suceeding * Succesfully issuing from pendle * redemption from pendle working * Add rsETH pendle position to tests * Add rswETH position to tests * Add Across WETH LP token * Contract code cleanup * Styling and docs * Factor out _depositIntoComponent * add issueExactSetFromERC20 method * add tests issuing from erc20 * factor out _swapFromEthToToken * more refactoring * Undo changes to prettierrc * Add docstring * Add array of swapdata for non-standard components * Adjust tests * Adjust swap logic for non standard components * Run FlashMintHyETH tests in CI (#174) * shift .only to latest contract * remove TODO comments --------- Co-authored-by: pblivin0x <[email protected]> Co-authored-by: Pranav Bhardwaj <[email protected]>
1 parent 212d252 commit e0cf003

16 files changed

+2293
-3
lines changed

contracts/exchangeIssuance/DEXAdapterV2.sol

Lines changed: 802 additions & 0 deletions
Large diffs are not rendered by default.

contracts/exchangeIssuance/FlashMintHyETH.sol

Lines changed: 640 additions & 0 deletions
Large diffs are not rendered by default.

contracts/interfaces/IERC4626.sol

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity 0.6.10;
3+
4+
interface IERC4626 {
5+
function deposit(uint256 assets_, address receiver_) external returns (uint256 shares_);
6+
function mint(uint256 shares_, address receiver_) external returns (uint256 assets_);
7+
function redeem(uint256 shares_, address receiver_, address owner_) external returns (uint256 assetsAfterFee_);
8+
function withdraw(uint256 assets_, address receiver_, address owner_) external returns (uint256 shares_);
9+
function previewDeposit(uint256 assets) external view returns (uint256);
10+
function previewMint(uint256 shares) external view returns (uint256);
11+
function previewRedeem(uint256 shares) external view returns (uint256);
12+
function previewWithdraw(uint256 assets) external view returns (uint256);
13+
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity 0.6.10;
3+
pragma experimental ABIEncoderV2;
4+
5+
interface IAcrossHubPoolV2 {
6+
function addLiquidity(address l1Token, uint256 l1TokenAmount) external payable;
7+
function bondAmount() external view returns (uint256);
8+
function bondToken() external view returns (address);
9+
function claimProtocolFeesCaptured(address l1Token) external;
10+
function crossChainContracts(uint256) external view returns (address adapter, address spokePool);
11+
function disableL1TokenForLiquidityProvision(address l1Token) external;
12+
function disputeRootBundle() external;
13+
function emergencyDeleteProposal() external;
14+
function enableL1TokenForLiquidityProvision(address l1Token) external;
15+
function exchangeRateCurrent(address l1Token) external returns (uint256);
16+
function executeRootBundle(
17+
uint256 chainId,
18+
uint256 groupIndex,
19+
uint256[] memory bundleLpFees,
20+
int256[] memory netSendAmounts,
21+
int256[] memory runningBalances,
22+
uint8 leafId,
23+
address[] memory l1Tokens,
24+
bytes32[] memory proof
25+
) external;
26+
function finder() external view returns (address);
27+
function getCurrentTime() external view returns (uint256);
28+
function haircutReserves(address l1Token, int256 haircutAmount) external;
29+
function identifier() external view returns (bytes32);
30+
function liquidityUtilizationCurrent(address l1Token) external returns (uint256);
31+
function liquidityUtilizationPostRelay(address l1Token, uint256 relayedAmount) external returns (uint256);
32+
function liveness() external view returns (uint32);
33+
function loadEthForL2Calls() external payable;
34+
function lpFeeRatePerSecond() external view returns (uint256);
35+
function lpTokenFactory() external view returns (address);
36+
function multicall(bytes[] memory data) external payable returns (bytes[] memory results);
37+
function owner() external view returns (address);
38+
function paused() external view returns (bool);
39+
function poolRebalanceRoute(uint256 destinationChainId, address l1Token)
40+
external
41+
view
42+
returns (address destinationToken);
43+
function pooledTokens(address)
44+
external
45+
view
46+
returns (
47+
address lpToken,
48+
bool isEnabled,
49+
uint32 lastLpFeeUpdate,
50+
int256 utilizedReserves,
51+
uint256 liquidReserves,
52+
uint256 undistributedLpFees
53+
);
54+
function proposeRootBundle(
55+
uint256[] memory bundleEvaluationBlockNumbers,
56+
uint8 poolRebalanceLeafCount,
57+
bytes32 poolRebalanceRoot,
58+
bytes32 relayerRefundRoot,
59+
bytes32 slowRelayRoot
60+
) external;
61+
function protocolFeeCaptureAddress() external view returns (address);
62+
function protocolFeeCapturePct() external view returns (uint256);
63+
function relaySpokePoolAdminFunction(uint256 chainId, bytes memory functionData) external;
64+
function removeLiquidity(address l1Token, uint256 lpTokenAmount, bool sendEth) external;
65+
function renounceOwnership() external;
66+
function rootBundleProposal()
67+
external
68+
view
69+
returns (
70+
bytes32 poolRebalanceRoot,
71+
bytes32 relayerRefundRoot,
72+
bytes32 slowRelayRoot,
73+
uint256 claimedBitMap,
74+
address proposer,
75+
uint8 unclaimedPoolRebalanceLeafCount,
76+
uint32 challengePeriodEndTimestamp
77+
);
78+
function setBond(address newBondToken, uint256 newBondAmount) external;
79+
function setCrossChainContracts(uint256 l2ChainId, address adapter, address spokePool) external;
80+
function setCurrentTime(uint256 time) external;
81+
function setDepositRoute(
82+
uint256 originChainId,
83+
uint256 destinationChainId,
84+
address originToken,
85+
bool depositsEnabled
86+
) external;
87+
function setIdentifier(bytes32 newIdentifier) external;
88+
function setLiveness(uint32 newLiveness) external;
89+
function setPaused(bool pause) external;
90+
function setPoolRebalanceRoute(uint256 destinationChainId, address l1Token, address destinationToken) external;
91+
function setProtocolFeeCapture(address newProtocolFeeCaptureAddress, uint256 newProtocolFeeCapturePct) external;
92+
function sync(address l1Token) external;
93+
function timerAddress() external view returns (address);
94+
function transferOwnership(address newOwner) external;
95+
function unclaimedAccumulatedProtocolFees(address) external view returns (uint256);
96+
function weth() external view returns (address);
97+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity 0.6.10;
3+
pragma experimental ABIEncoderV2;
4+
5+
interface IPendleMarketV3 {
6+
struct MarketState {
7+
int256 totalPt;
8+
int256 totalSy;
9+
int256 totalLp;
10+
address treasury;
11+
int256 scalarRoot;
12+
uint256 expiry;
13+
uint256 lnFeeRateRoot;
14+
uint256 reserveFeePercent;
15+
uint256 lastLnImpliedRate;
16+
}
17+
18+
function DOMAIN_SEPARATOR() external view returns (bytes32);
19+
function _storage()
20+
external
21+
view
22+
returns (
23+
int128 totalPt,
24+
int128 totalSy,
25+
uint96 lastLnImpliedRate,
26+
uint16 observationIndex,
27+
uint16 observationCardinality,
28+
uint16 observationCardinalityNext
29+
);
30+
function activeBalance(address) external view returns (uint256);
31+
function allowance(address owner, address spender) external view returns (uint256);
32+
function approve(address spender, uint256 amount) external returns (bool);
33+
function balanceOf(address account) external view returns (uint256);
34+
function burn(address receiverSy, address receiverPt, uint256 netLpToBurn)
35+
external
36+
returns (uint256 netSyOut, uint256 netPtOut);
37+
function decimals() external view returns (uint8);
38+
function eip712Domain()
39+
external
40+
view
41+
returns (
42+
bytes1 fields,
43+
string memory name,
44+
string memory version,
45+
uint256 chainId,
46+
address verifyingContract,
47+
bytes32 salt,
48+
uint256[] memory extensions
49+
);
50+
function expiry() external view returns (uint256);
51+
function factory() external view returns (address);
52+
function getNonOverrideLnFeeRateRoot() external view returns (uint80);
53+
function getRewardTokens() external view returns (address[] memory);
54+
function increaseObservationsCardinalityNext(uint16 cardinalityNext) external;
55+
function isExpired() external view returns (bool);
56+
function lastRewardBlock() external view returns (uint256);
57+
function mint(address receiver, uint256 netSyDesired, uint256 netPtDesired)
58+
external
59+
returns (uint256 netLpOut, uint256 netSyUsed, uint256 netPtUsed);
60+
function name() external view returns (string memory);
61+
function nonces(address owner) external view returns (uint256);
62+
function observations(uint256)
63+
external
64+
view
65+
returns (uint32 blockTimestamp, uint216 lnImpliedRateCumulative, bool initialized);
66+
function observe(uint32[] memory secondsAgos) external view returns (uint216[] memory lnImpliedRateCumulative);
67+
function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
68+
external;
69+
function readState(address router) external view returns (MarketState memory market);
70+
function readTokens() external view returns (address _SY, address _PT, address _YT);
71+
function redeemRewards(address user) external returns (uint256[] memory);
72+
function rewardState(address) external view returns (uint128 index, uint128 lastBalance);
73+
function skim() external;
74+
function swapExactPtForSy(address receiver, uint256 exactPtIn, bytes memory data)
75+
external
76+
returns (uint256 netSyOut, uint256 netSyFee);
77+
function swapSyForExactPt(address receiver, uint256 exactPtOut, bytes memory data)
78+
external
79+
returns (uint256 netSyIn, uint256 netSyFee);
80+
function symbol() external view returns (string memory);
81+
function totalActiveSupply() external view returns (uint256);
82+
function totalSupply() external view returns (uint256);
83+
function transfer(address to, uint256 amount) external returns (bool);
84+
function transferFrom(address from, address to, uint256 amount) external returns (bool);
85+
function userReward(address, address) external view returns (uint128 index, uint128 accrued);
86+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity 0.6.10;
3+
pragma experimental ABIEncoderV2;
4+
5+
interface IPendlePrincipalToken {
6+
function DOMAIN_SEPARATOR() external view returns (bytes32);
7+
function SY() external view returns (address);
8+
function YT() external view returns (address);
9+
function allowance(address owner, address spender) external view returns (uint256);
10+
function approve(address spender, uint256 amount) external returns (bool);
11+
function balanceOf(address account) external view returns (uint256);
12+
function burnByYT(address user, uint256 amount) external;
13+
function decimals() external view returns (uint8);
14+
function eip712Domain()
15+
external
16+
view
17+
returns (
18+
bytes1 fields,
19+
string memory name,
20+
string memory version,
21+
uint256 chainId,
22+
address verifyingContract,
23+
bytes32 salt,
24+
uint256[] memory extensions
25+
);
26+
function expiry() external view returns (uint256);
27+
function factory() external view returns (address);
28+
function initialize(address _YT) external;
29+
function isExpired() external view returns (bool);
30+
function mintByYT(address user, uint256 amount) external;
31+
function name() external view returns (string memory);
32+
function nonces(address owner) external view returns (uint256);
33+
function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
34+
external;
35+
function symbol() external view returns (string memory);
36+
function totalSupply() external view returns (uint256);
37+
function transfer(address to, uint256 amount) external returns (bool);
38+
function transferFrom(address from, address to, uint256 amount) external returns (bool);
39+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity 0.6.10;
3+
pragma experimental ABIEncoderV2;
4+
5+
interface IPendleStandardizedYield {
6+
function DOMAIN_SEPARATOR() external view returns (bytes32);
7+
function accruedRewards(address) external view returns (uint256[] memory rewardAmounts);
8+
function allowance(address owner, address spender) external view returns (uint256);
9+
function approve(address spender, uint256 amount) external returns (bool);
10+
function assetInfo() external view returns (uint8, address, uint8);
11+
function balanceOf(address account) external view returns (uint256);
12+
function claimOwnership() external;
13+
function claimRewards(address) external returns (uint256[] memory rewardAmounts);
14+
function decimals() external view returns (uint8);
15+
function deposit(address receiver, address tokenIn, uint256 amountTokenToDeposit, uint256 minSharesOut)
16+
external
17+
payable
18+
returns (uint256 amountSharesOut);
19+
function eETH() external view returns (address);
20+
function eip712Domain()
21+
external
22+
view
23+
returns (
24+
bytes1 fields,
25+
string memory name,
26+
string memory version,
27+
uint256 chainId,
28+
address verifyingContract,
29+
bytes32 salt,
30+
uint256[] memory extensions
31+
);
32+
function exchangeRate() external view returns (uint256);
33+
function getRewardTokens() external view returns (address[] memory rewardTokens);
34+
function getTokensIn() external view returns (address[] memory res);
35+
function getTokensOut() external view returns (address[] memory res);
36+
function isValidTokenIn(address token) external view returns (bool);
37+
function isValidTokenOut(address token) external view returns (bool);
38+
function liquidityPool() external view returns (address);
39+
function name() external view returns (string memory);
40+
function nonces(address owner) external view returns (uint256);
41+
function owner() external view returns (address);
42+
function pause() external;
43+
function paused() external view returns (bool);
44+
function pendingOwner() external view returns (address);
45+
function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
46+
external;
47+
function previewDeposit(address tokenIn, uint256 amountTokenToDeposit)
48+
external
49+
view
50+
returns (uint256 amountSharesOut);
51+
function previewRedeem(address tokenOut, uint256 amountSharesToRedeem)
52+
external
53+
view
54+
returns (uint256 amountTokenOut);
55+
function redeem(
56+
address receiver,
57+
uint256 amountSharesToRedeem,
58+
address tokenOut,
59+
uint256 minTokenOut,
60+
bool burnFromInternalBalance
61+
) external returns (uint256 amountTokenOut);
62+
function referee() external view returns (address);
63+
function rewardIndexesCurrent() external returns (uint256[] memory indexes);
64+
function rewardIndexesStored() external view returns (uint256[] memory indexes);
65+
function symbol() external view returns (string memory);
66+
function totalSupply() external view returns (uint256);
67+
function transfer(address to, uint256 amount) external returns (bool);
68+
function transferFrom(address from, address to, uint256 amount) external returns (bool);
69+
function transferOwnership(address newOwner, bool direct, bool renounce) external;
70+
function unpause() external;
71+
function weETH() external view returns (address);
72+
function yieldToken() external view returns (address);
73+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity 0.6.10;
3+
4+
interface IStETH {
5+
function submit(address _referral) external payable returns (uint256);
6+
}

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"build:typechain": "yarn patch-hardhat-typechain && yarn typechain && yarn fix-typechain && yarn transpile-dist",
2121
"chain": "npx hardhat node --no-deploy",
2222
"chain:fork": "FORK=true yarn run chain",
23-
"chain:fork:ethereum": "yarn run chain",
23+
"chain:fork:ethereum": "yarn run chain:fork",
2424
"chain:fork:polygon": "NETWORK=polygon yarn run chain:fork",
2525
"chain:fork:optimism": "NETWORK=optimism yarn run chain:fork",
2626
"chain:fork:arbitrum": "NETWORK=arbitrum yarn run chain:fork",
@@ -87,6 +87,8 @@
8787
"husky": "^4.2.5",
8888
"lint-staged": "^10.2.11",
8989
"lodash": "^4.17.4",
90+
"prettier": "^3.2.5",
91+
"prettier-plugin-solidity": "^1.3.1",
9092
"semantic-release": "^19.0.2",
9193
"solc": "^0.6.10",
9294
"solhint": "^3.1.0",

test/integration/ethereum/addresses.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ export const PRODUCTION_ADDRESSES = {
2525
wbtc: "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599",
2626
swETH: "0xf951E335afb289353dc249e82926178EaC7DEd78",
2727
ETHx: "0xA35b1B31Ce002FBF2058D22F30f95D405200A15b",
28+
instadappEthV2: "0xa0d3707c569ff8c87fa923d3823ec5d81c98be78",
29+
pendleEEth0624: "0xc69Ad9baB1dEE23F4605a82b3354F8E40d1E5966",
30+
pendleRsEth0624: "0xB05cABCd99cf9a73b19805edefC5f67CA5d1895E",
31+
pendleRswEth0624: "0x5cb12D56F5346a016DBBA8CA90635d82e6D1bcEa",
32+
weEth: "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee",
33+
rsEth: "0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7",
34+
rswEth: "0xFAe103DC9cf190eD75350761e95403b7b8aFa6c0",
35+
acrossWethLP: "0x28F77208728B0A45cAb24c4868334581Fe86F95B",
2836
},
2937
whales: {
3038
stEth: "0xdc24316b9ae028f1497c275eb9192a3ea0f67022",
@@ -56,6 +64,13 @@ export const PRODUCTION_ADDRESSES = {
5664
balancerv2: {
5765
vault: "0xBA12222222228d8Ba445958a75a0704d566BF2C8",
5866
},
67+
pendle: {
68+
markets: {
69+
eEth0624: "0xF32e58F92e60f4b0A37A69b95d642A471365EAe8",
70+
rsEth0624: "0x4f43c77872db6ba177c270986cd30c3381af37ee",
71+
rswEth0624: "0xa9355a5d306c67027c54de0e5a72df76befa5694",
72+
},
73+
},
5974
},
6075
set: {
6176
controller: "0xa4c8d221d8BB851f83aadd0223a8900A6921A349",
@@ -76,6 +91,7 @@ export const PRODUCTION_ADDRESSES = {
7691
aaveV3LeverageModule: "0x71E932715F5987077ADC5A7aA245f38841E0DcBe",
7792
constantPriceAdapter: "0x13c33656570092555Bf27Bdf53Ce24482B85D992",
7893
linearPriceAdapter: "0x237F7BBe0b358415bE84AB6d279D4338C0d026bB",
94+
setTokenCreator: "0x2758BF6Af0EC63f1710d3d7890e1C263a247B75E",
7995
},
8096
lending: {
8197
aave: {

0 commit comments

Comments
 (0)